Tho*_*hor 12 java generics collections
我目前正在学习java泛型,下面是java中不可重用的类型列表.
如果类型是以下之一,则该类型不可再生:
•类型变量(例如T)
•具有实际参数的参数化类型(例如List<Number>, ArrayList<String>, or Map<String, Integer>)
•带有边界的参数化类型(例如List<? extends Number> or Comparable<? super String>)
我理解为什么带有实际参数的参数化类型和带有bound的参数化类型是不可再生的,因为在运行时擦除之后,剩下的唯一类型信息是List,但为什么类型变量(例如T)是不可再生的类型?我认为在运行时,在类型擦除之后,T将变为Object(给定T是未绑定的类型参数),因此类型信息可用.
我的理解有问题吗?
小智 5
当一个对象的输入信息在编译时没有丢失时,该对象是可以恢复的.不可再生对象上不允许执行某些操作.例如,我们不能做一个实例.
通用类型不可再生,这就是为什么我们不能这样做
List <Conference> instance
Run Code Online (Sandbox Code Playgroud)
这在某些情况下是实用的,但我们不能忘记JDK必须从一个版本向后兼容.此约束解释了实现中的一些限制.
如果Java类型在执行期间完全表示(没有擦除类型),则它是可再现的:
primitive type
non-parametric type
parametric type in which all arguments of type are unbounded jokers (List <?>)
type "raw" (List)
table whose type of elements is reifiable
Run Code Online (Sandbox Code Playgroud)
我不知道这是否可以帮助你,如果没有,我可以删除它,祝你有美好的一天!
文档指出
不可具体化的类型在运行时并不具有所有可用的信息。
运行时的类型T是Object这样的,所以信息会丢失。丢失信息的一个例子是如何创建对象。考虑这个类:
public class A {
private int a;
public A() {
a = 5;
}
}
Run Code Online (Sandbox Code Playgroud)
现在看看这段未编译的代码:
public class Generic<T> {
T foo() {
return new T(); //Compiler Error!
}
}
Run Code Online (Sandbox Code Playgroud)
如果允许这样做并且您正在实例化 aGeneric<A> g = new Generic<>();并调用,则无法调用 的g.foo()构造函数,因为在运行时,仅称为。因此,无法创建并返回有效的实例。您甚至无法确定构造函数需要哪些信息。如何构建的信息丢失了。TTObjectATT
这就是类型参数必须是不可具体化类型的原因之一。