以下语句之间有什么区别:
List<E>[] x = (List<E>[]) new List[100];
和
List<E>[] x = new List[100];
在我的脚本中,注意到前者将是创建泛型数组的正确方法(尽管它会导致编译器警告)。但我不太清楚(List<E>[])
语句的用途。List<E>[]
甚至不是它自己的类型,编译器将简单地用(List[])
替换它,所以
List<E>[] x = (List[]) new List[100];
从List[]
到List[]
的转换,这是无用的。那么,为什么首先要设置一个(List<E>[])
呢?
发布于 2013-08-24 09:25:29
泛型通过使更多的bug在编译时可以检测到,从而增加了代码的稳定性。
这是我给出的链接的一部分,我认为这是很重要的,所以我在这里发布。
这是列表和包java.util中的Iterator定义的一个小片段: 公共接口列表{ void (E);Iterator迭代器();}公共接口Iterator {E next();布尔hasNext();} 这段代码应该是熟悉的,除了尖括号中的内容。这些是接口列表和Iterator的https://stackoverflow.com/questions/360766/java-formal-type-parameter-definition-generics声明。 类型参数可以在泛型声明中使用,几乎可以使用普通类型。 我们知道泛型类型声明列表的调用,例如列表。在调用(通常称为参数化类型)中,形式类型参数(在本例中为E)的所有出现都被实际类型参数(本例中为整数)所替换。 --您可能会想到,列表代表的是列表的一个版本,其中E已一致地被Integer替换:公共接口IntegerList { void (Integer);Iterator迭代器();} 这种直觉是有帮助的,但它也是误导。 这是有帮助的,因为参数化类型列表确实有类似于此展开的方法。 它具有误导性,因为泛型的声明从来没有以这种方式展开过。代码没有多个副本--不是在源代码中,不是二进制中,不是磁盘上,也不是内存中。 泛型类型声明被一劳永逸地编译,并转化为一个类文件,就像普通类或接口声明一样. 类型参数类似于方法或构造函数中使用的普通参数。就像方法具有描述其操作的值类型的形式值参数一样,泛型声明具有形式类型参数。当方法被调用时,实际的参数被替换为形式参数,并且方法体被求值。在调用泛型声明时,实际的类型参数将被替换为形式类型参数。这就是泛型的>重要性.. 你可以在这里寻找http://docs.oracle.com/javase/tutorial/extra/generics/intro.html
发布于 2013-08-24 09:58:18
这是:
List<E>[] x = new List[100];
说x是数组类型。该数组的元素是可以容纳类型E对象的列表。您将为其分配一个列表数组,该数组可以保存任何对象。
下一份声明:
List<E>[] x = (List<E>[]) new List[100];
再好不过了。演员也帮不上忙。缺陷仍然是一样的。
最后,所有这些都是这样做的借口:
List<E>[] x = new List<E>[100];
Java中不允许泛型数组。因为数组在运行时保留其元素类型,而一般构造则不保留。必须没有严格定义元素类型的数组。
问题在于定义了引用类型List<E>[]
,根据定义,它不允许在Java中实例化。所以,避免使用这类类型。
您可以使用列表作为替代方案。
发布于 2013-08-24 09:59:07
与泛型一样,存储在任何集合中的对象类型将在将其添加到集合时进行类型检查。主要通过泛型,代码可以被其他不需要知道泛型的人理解。因此,通过在编译时插入检查,并在运行时擦除,可以实现这种行为。
https://stackoverflow.com/questions/18420797
复制