0

1)我想知道为什么泛型方法和类不带 super 关键字,尽管扩展被接受?

2)由于类型擦除,我们不能将运算符的实例与泛型一起使用,但是为什么允许类型转换?

例如:

 if (objecta instanceof Object){} //doesn't work  
 Collection collection = new ArrayList();   
 Collection<Integer> d1 = (Collection<Integer>)collection; //works fine.  

根据我的理解,它不应该是因为我们试图将它转换为 Collection 并且在运行时没有 Collection 。

3)我读过静态变量不能是泛型类的成员,但我不太清楚为什么。为什么会显示以下行为?

 public class NoGenericss  
 { static List<Integer> list; //WORKS FINE  
 static List<T> list1; //COMPILATION ERROR   
 public class Genericss<T>  

 { static List<Integer> list; //WORKS FINE   
 static List<T> list1; //COMPILATION ERROR  
 static void meth(T t){} //COMPILATION ERROR  
 static <S> void meth(S t){} //WORKS FINE

为什么会出现这种可变行为?

4

1 回答 1

1

有关 Java 泛型的一些参考,请参阅Sun 教程

2)

运算符是动态的instanceof,这意味着它在运行时检查对象的类型。由于类型擦除,对象(例如集合)的泛型类型在运行时不可用(a List<Integer>List<String>,List<URI>成为某些对象的全部只是Lists)。

但是,演员表是静态的。Java 编译器会检查变量的类型参数。如果你这样做:

List<Integer> ints = Arrays.asList(1, 2, 3);
List<String> strings = (List<String>) ints;

...编译器显示未经检查的警告,因为此操作是可能的,但不安全。因为现在当你这样做时:

String s = ints.get(0);

ClassCastException在运行时得到 a ,因为 VM 会尝试将a 强制Integer转换为String.

发生这种情况是因为编译器将上述带有泛型的源代码编译为以下代码的等价物。类型擦除是以这种方式实现的,因此所有泛型参数都消失了,使所有集合都只是Objects 的集合,因此,只要需要,就会在代码中插入强制转换。

List ints = Arrays.asList(1, 2, 3);
List strings = ints;
String s = (String) ints.get(0);

3)

<T>type 参数仅对成员字段和成员方法可见。泛型类的每个实例都可以有不同T的 ,例如,如果您有一个类:

class List<T> { // this is not java.util.List, just some custom class
    public List<T> subList(int start, int end) { ... }
    ...
}

...然后你可以这样做:

List<String> strings = ...
List<String> stringsSub = strings.subList(1, 2);

... 但是也:

List<Integer> ints = ...
List<Integer> intsSub = ints.subList(1, 2);

如您所见,第一个实例T设置为String,第二个实例设置为Integer。所以成员方法subList总是返回一个List相同的T

现在,假设您添加了一个静态字段:

class List<T> {
    public static List<T> CONSTANT_LIST = ...
    ...
}

......T在这种情况下会是CONSTANT_LIST什么?String, Integer, 还有什么?好吧,这是不可能定义的,因为静态变量独立于任何类实例而存在。这就是T他们看不见的原因。

另一方面,使用具体的泛型类型添加静态是没有问题的:

class List<T> {
    public static List<Integer> CONSTANT_LIST = new List(1, 2, 3);
    ...
}
于 2012-09-09T16:41:40.607 回答