- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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
为什么会出现如此多变的行为?
最佳答案
有关 Java 泛型的一些引用,请参阅 Sun tutorial .
instanceof
运算符是动态的,这意味着它在运行时检查对象的类型。由于类型删除,对象(例如集合)的通用类型在运行时不可用( List<Integer>
、 List<String
>、 List<URI>
全部变成 List
s一些对象)。
但是,强制转换是静态的。 Java 编译器会检查变量的类型参数。如果您这样做:
List<Integer> ints = Arrays.asList(1, 2, 3);
List<String> strings = (List<String>) ints;
...编译器显示未经检查的警告,因为此操作是可能的,但不安全。因为现在当你这样做时:
String s = ints.get(0);
您会得到 ClassCastException
在运行时,因为虚拟机将尝试转换 Integer
到 String
.
发生这种情况是因为编译器将上述带有泛型的源代码编译为与以下代码等效的代码。类型删除是以这样的方式实现的,这样所有的泛型参数都消失了,使得所有集合都只是 Object
的集合。 s,因此,只要有必要,就会在代码中插入强制转换。
List ints = Arrays.asList(1, 2, 3);
List strings = ints;
String s = (String) ints.get(0);
<小时/>
<T>
类型参数仅对成员字段和成员方法可见。泛型类的每个实例可以有不同的 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);
...
}
关于java - 关于类型转换、静态和实例的泛型查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12340548/
我是一名优秀的程序员,十分优秀!