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

为什么类型变量在java中是不可重写的类型,java,generics,collections,Java,Generics,Collections,我目前正在学习java泛型,下面是java中不可修改的类型列表 如果类型是以下类型之一,则该类型不可重新定义: •类型变量 (例如T) •具有实际参数的参数化类型 (例如列表、ArrayList或Map) •具有边界的参数化类型 (例如List当对象的类型信息在编译时没有丢失时,该对象是可恢复的。不允许对不可恢复的对象执行某些操作。例如,我们不能执行的实例 泛型类型是不可重新定义的,这就是为什么我们不能这样做的原因 List <Conference> instance 列表实例

我目前正在学习java泛型,下面是java中不可修改的类型列表

如果类型是以下类型之一,则该类型不可重新定义:

•类型变量 (例如
T

•具有实际参数的参数化类型 (例如
列表、ArrayList或Map

•具有边界的参数化类型
(例如
List当对象的类型信息在编译时没有丢失时,该对象是可恢复的。不允许对不可恢复的对象执行某些操作。例如,我们不能执行的实例

泛型类型是不可重新定义的,这就是为什么我们不能这样做的原因

 List <Conference> instance
列表实例
这在某些情况下是可行的,但我们不能忘记JDK必须从一个版本向后兼容到另一个版本

如果表示Java类型,则它是可重新定义的 在执行过程中完全执行(无擦除 类型):

基本类型
非参数类型
参数化类型,其中类型的所有参数都是无界小丑(列表)
输入“原始”(列表)
元素类型可重新定义的表
我不知道这是否能帮助你,如果不能,我可以删除它,祝你愉快!

该州

不可修改的类型在运行时没有可用的所有信息

运行时的<代码> t>代码>是代码>对象< /代码>,因此信息丢失。丢失的信息的一个示例是如何创建对象。请考虑这个类:

public class A {
    private int a;
    public A() {
        a = 5;
    }
}
现在看一看这段非编译代码:

公共类泛型{
T foo(){
返回新的T();//编译器错误!
}
}
如果这是允许的,并且您正在实例化一个
Generic g=new Generic();
并调用
g.foo()
,无法调用
T
的构造函数,因为在运行时,
T
只被称为
Object
。因此,无法创建并返回
A
的有效实例。您甚至无法确定
T
的构造函数需要哪些信息。可以构造
T
的信息特德迷路了


这就是为什么类型参数必须是不可重新定义的类型的原因。

也许问题的答案可以回答你的问题?它处理相同的问题。这正是它的意思。与其将
T
具体化为它所代表的类型,不如将其删除到上限。@Ben谢谢你的建议,我已经看过了那篇文章,但是我的问题更多地集中在类型参数上,所以我猜这些问题是相似的,但并不完全相同。@Thor是的,我想,这就是为什么我只是建议它不要重复:)它是不可修改的,因为它在运行时没有被保存。这就是不可偿还的意思。至于为什么
newt[]
是非法的,这是因为数组类型是具体化的,并且将数组与泛型混合会导致堆污染。考虑<代码> t[]=新T〔10〕;对象[]o=t;o[0]=1。如果将
T
替换为
String
,则会引发
ArrayStoreException
。但是,如果
T
是一个泛型类型,该类型被擦除为
对象
,那么尽管可能违反了泛型不变量,但代码仍将无误运行。您可以通过将
对象[]
强制转换为
T[]
来轻松测试这一点。
public class A {
    private int a;
    public A() {
        a = 5;
    }
}
public class Generic<T> {
    T foo() {
        return new T(); //Compiler Error!
    }
}