为什么type变量在java中是不可重入的类型

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)

我不知道这是否可以帮助你,如果没有,我可以删除它,祝你有美好的一天!


Tob*_*ias 3

文档指出

不可具体化的类型在运行时并不具有所有可用的信息。

运行时的类型TObject这样的,所以信息会丢失。丢失信息的一个例子是如何创建对象。考虑这个类:

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

这就是类型参数必须是不可具体化类型的原因之一。