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