2013-05-27 87 views
1

这是不是一个问题该怎么做。这是一个问题为什么是它的方式。java数组参数类型

Java中的数组在运行时知道它们的组件类型,并且由于类型擦除,我们不能拥有泛型类型变量的数组对象。允许使用涉及泛型的数组类型,并检查声音的读/写情况,唯一的问题似乎是分配器表达式。

注意,Java编译器也不允许以下:

Pong<Integer> lotsofpong [] = new Pong<Integer>[100]; 

...其中Pong是任何旧的参数类。这里什么都没有。是的,在运行时,lotsofpong只是一个Pong的数组,但我看不到为什么编译器不能记住类型参数以便编译时使用。嗯,它确实记得它,因为这些类型是在编译时存在的,所以唯一的问题似乎是拒绝在编译时为分配器提供一个特定的涉及参数的组件类型。

即使参数Pong是一个通用类型变量,也不应该有所作为。动态数组仍然是一个Pong的数组,要求每个元素的大小为Pong,它不依赖于它的类型参数。

是的,我知道有办法解决它 - 要么使用非参数类型的casts(可能带有SuppressWarning),要么使用非参数类的子类Pong<Integer>,而是使用该类型。但是,为什么这种分配器是不允许的?

+0

http://stackoverflow.com/questions/9542076/array-of-parameterized-types,http://stackoverflow.com/questions/529085/java-how-to-generic-array-creation和http: //www.ibm.com/developerworks/java/library/j-jtp01255/index.html可能是有趣的。 – jedwards

+1

有效的Java项目25.我不太记得它,但是您可以试试[google书籍链接](http://books.google.com/books?id=ka2VUBqHiWkC&pg=PA119&lpg=PA119&dq=effective+java+generic +阵列&源= BL&OTS = yYIoOin1VY&SIG = OLgj07rc_1YGLtguS2E1slt2iDc&HL = EN&SA = X&EI = Kw6jUZDUCbTV4ASajIGIAw&VED = 0CC4Q6AEwAA#v = onepage&q =有效%20java%20generic%20array&F =假) – zeller

回答

1

基于Zeller提供的链接(基于Josh Bloch - 'Effective Java Book')。

数组是不是安全的,因为下面的代码编译:java.lang.ArrayStoreException:

String strings [] = {"Foo"}; 
Object objects [] = strings; 
objects[0] = 1; 

您将在运行时得到一个特殊的例外。 Java运行时在运行时会将适当的类型放入数组中。

将数组赋值给其超类型的数组称为'协方差'。

通用保证在编译时安全。

如果你在问题中提到的代码片段能够被编译,下面的代码也会编译:

Pong<Integer> integerPongs [] = new Pong<Integer>[100]; 
Object objectPongs [] = integerPongs; 
objectPongs[0] = new Pong<String>(); 
Pong<Integer> stringPong = integerPongs[0]; // ClassCastException 

我们的代码变得不因此安全它是由规范禁止的。

的原因:

objectPongs[0] = new Pong<String>(); 

不会抛出java.lang.ArrayStoreException是因为运行时型傍的每个实例的是一直以来泛型傍是编译时机制。