Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类型擦除-将Java泛型类扩展为非泛型_Java_Generics_Extends_Type Erasure - Fatal编程技术网

类型擦除-将Java泛型类扩展为非泛型

类型擦除-将Java泛型类扩展为非泛型,java,generics,extends,type-erasure,Java,Generics,Extends,Type Erasure,如果我这样做: public class IntegerList extends ArrayList < Integer > { } 公共类IntegerList扩展了ArrayList{} 我是否能够正常使用IntegerList而不必担心类型擦除,这意味着我可以使用和创建它们的数组并动态实例化它们,并且任何兼容的编译器或IDE都能够正确地执行编译时和运行时类型检查?是的,IntegerList是一种具体化类型,这就是我认为你想说的 当我们使用它时,ArrayList也是一种具

如果我这样做:

public class IntegerList extends ArrayList < Integer > { }
公共类IntegerList扩展了ArrayList{}

我是否能够正常使用
IntegerList
而不必担心类型擦除,这意味着我可以使用和创建它们的数组并动态实例化它们,并且任何兼容的编译器或IDE都能够正确地执行编译时和运行时类型检查?

是的,
IntegerList
是一种具体化类型,这就是我认为你想说的


当我们使用它时,
ArrayList
也是一种具体化类型,这意味着您可以使用
ArrayList
执行与使用
IntegerList
相同的操作。(但不是使用
ArrayList
,它不是具体化类型。)

是的,
IntegerList
是具体化类型,我想你是想这么说的


当我们使用它时,
ArrayList
也是一种具体化类型,这意味着您可以使用
ArrayList
执行与使用
IntegerList
相同的操作。(但不是使用
ArrayList
,它不是一种具体化类型。)

虽然我无法从技术上解释原因,但我知道答案是肯定的,我做这些事情没有任何问题,这绝对不错(就语言而言)。老实说,在回答中很难给出比这更多的答案。。。就设计而言,它不太令人愉快-例如,不是每个
列表都是
整数列表,因此您不能互换使用它们。但它会起作用。我在这里看到的最大危险是实现方法重载。。。如果您实现了,比如说,
.add(int)
,那么您必须确保它在幕后求助于
ArrayList
.add()
。IOW:用合成来代替!我可以拥有
public PlayerRecordList PlayerRecords=new PlayerRecordList()
然后执行(PlayerRecord currecord:PlayerRecords)
即可,没有问题。至于可读性,它比HashMap和ArrayList更容易理解。如果我的实现不关心我使用的是什么后端列表,那么必须公开它并增加视觉复杂性是很愚蠢的。如果你试图绕过类型擦除,你可能会想尝试一种更类似的方法,虽然我无法从技术上解释为什么,我知道答案是肯定的,我做这些事情没有问题,那绝对好(就语言而言)。老实说,在回答中很难给出比这更多的答案。从设计角度来说,它不太令人愉快-例如,不是每个
列表都是
整数列表,所以你不能互换使用它们。但它会起作用。我在这里看到的最大危险是实现方法重载…如果你实现,比如说,
.add(int)
,您必须确保它在幕后求助于
ArrayList
.add()
。注意:使用合成!我可以使用
公共PlayerRecordList PlayerRecords=new PlayerRecordList();
然后对(PlayerRecord:PlayerRecords)执行
没问题。至于可读性,理解
HashMap
要比理解
HashMap,ArrayList>
容易得多。如果我的实现不关心我使用的是什么后端列表,那么必须公开它并增加视觉复杂性是愚蠢的。如果你不是这样做的话为了避开类型擦除,您可能想尝试一种更像我不太明白您的意思的方法。我们在Java中没有具体化泛型,您所说的也不同于一般对具体化泛型的理解。我想知道您试图表达的意思,您介意再详细阐述一下吗?:)@阿德里安山:你不明白哪一部分?当你做
新事物[5]
时,
事物必须是具体化类型。当您执行某事物的
实例时,
某事物
必须是具体化类型。这就是OP所说的。具体化类型是运行时存在的类型,即原始类型。Java没有具体化的泛型,这与具体化的泛型无关。在具体化泛型中,参数化类型是具体化类型。在Java中,它们不是。oops明白你的意思了。我想我把你说的和具体化的泛型混淆了:PI不太明白你的意思。我们在Java中没有具体化泛型,您所说的也不同于对具体化泛型的一般理解。我很想知道你想表达什么意思,你介意再详细一点吗?:)@阿德里安山:你不明白哪一部分?当你做
新事物[5]
时,
事物必须是具体化类型。当您执行某事物的
实例时,
某事物
必须是具体化类型。这就是OP所说的。具体化类型是运行时存在的类型,即原始类型。Java没有具体化的泛型,这与具体化的泛型无关。在具体化泛型中,参数化类型是具体化类型。在Java中,它们不是。oops明白你的意思了。我想我把你说的和具体化的泛型混淆了:P