2013-08-24 54 views
5

阵列什么是下面的语句之间的区别:转换泛型

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>[])放在第一位呢?

+1

这是code java吗? – 6502

+1

小心提及语言。 – Malwaregeek

+0

对不起,问题已编辑。不知道接口部分,我只是将它复制出我的脚本,所以我认为它是有效的代码。 – user2440792

回答

3

通过在编译时检测到更多的错误,泛型增加了代码的稳定性。

这是我给的链接的一部分,认为是重要的,所以我张贴在这里

这是从接口的定义,一个小摘录名单 和Iterator在java.util包中:

public interface List <E> { 
    void add(E x); 
    Iterator<E> iterator(); 
} 

public interface Iterator<E> { 
    E next(); 
    boolean hasNext(); 
} 

此代码应该都不会陌生,除了在角 Brack的东西ETS。这些是接口List和Iterator的formal type parameters的声明。

类型参数可以在整个泛型声明中使用,相当多 您可以使用普通类型。

我们知道泛型类型声明List的调用,如 List。在调用中(通常称为参数化的 类型),所有正式类型参数(本例中为E) 被实际类型参数(在本例中为Integer)取代。

你可能认为列表代表一个版本列表 的其中E已经整型被统一更换:

public interface IntegerList { 
     void add(Integer x); 
     Iterator<Integer> iterator(); 
    } 

这种直觉可能是有帮助的,但它也是误导

这很有帮助,因为参数化类型列表确实有 的方法看起来就像这个扩展。

这是误导性的,因为通用的声明绝不是 实际上以这种方式扩展。 代码不存在多个副本 - 不是源代码,不是二进制文件,也不是磁盘,也不是内存。

泛型类型声明编译一劳永逸,转身 成一个单一的类文件,就像一个普通的类或接口 声明。

类型参数类似于 方法或构造函数中使用的常规参数。就像一个方法具有形式值 参数一样,这些参数描述了其操作的值类型,通用的 声明具有正式的类型参数。当调用方法时, 实际参数将替换形式参数,并对方法体进行评估。

当调用一个通用的声明中, 实际类型参数代入形式类型参数。这就是泛型的重要性。

你可以看看这里的more information about Generics

+0

@ user2440792如果您的问题得到解答,请接受答案.. http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – Dileep

1

此:

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中实例化。所以,避免使用这种类型。

你可以使用List列表作为替代。

1

由于在泛型中存储在任何集合中的对象类型将在它们被添加到集合的位置进行类型检查。主要通过泛型,其他人可以理解那些不需要了解泛型的人可以理解的代码。所以通过在编译时插入检查和在运行时擦除启用此行为。

你可以看到:http://docs.oracle.com/javase/tutorial/java/generics/