2016-08-03 7 views
3

私は次の簡単なコードを持っている:コードが汎用で動作し、非永続クラスで動作しないのはなぜですか?

class GenClass<T> { 
    T method1(T in) { 
     T[] arr = (T[])new Object[10]; 
     arr[1] = in; 
     return arr[1]; 
    } 
} 

public class TestClass { 
    public static void main(String[] args) {  
     GenClass<Integer> cl = new GenClass<>(); 
     System.out.println(cl.method1(1000)); 

     Integer[] arr = (Integer[])new Object[10]; 
     arr[1] = 1000; 
     System.out.println(arr[1]); 
    } 
} 

結果は以下の通りであるだけでなく

1000 
Exception in thread "main" java.lang.ClassCastException: 
[Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer; 
at javaapplication8.TestClass.main(TestClass.java:17) 
Java Result: 1 

、なぜこのコードの動作:

T[] arr = (T[])new Object[10]; 

と、このコードのスローを実行時エラー:

Integer[] arr = (Integer[])new Object[10]; 

タイプ消去のためですか?

もしそうなら - 実行時に「T」は、単にソースコードので法1で「オブジェクト」と交換されている:

T[] arr = (T[])new Object[10]; 

は、実行時に次のようになりました:

Object[] arr = (Object[])new Object[10]; 

または何か別のものがありますか?

+0

キーワードである[型消去](https://docs.oracle.com/javase/tutorial/java/generics/bridgeMethods.html)、すなわちでObject [] arr =(Object [])new Object [10]; 'になります。 – Thomas

+0

[Javaジェネリック型消去の可能性のある複製時](http://stackoverflow.com/questions/339699/java-generics-type-erasure-when-and-what-happens) – Tom

答えて

3

あなたは、一般的なキャストがあるため型消去の作品、正しいです:Javaコンパイラは

Object[] arr = (Object[])new Object[10]; 

にこの

T[] arr = (T[])new Object[10]; 

を回すので、キャストが成功します。

非汎用キャストは、一方で、このようにエラーの原因と互換性のない型

Integer[] arr = (Integer[])new Object[10]; 

Objectの配列をキャストしようとします。

IntegerObject[]アレイに割り当てることが許可されているので、残りの汎用コードは正常に機能します。実際には、キャストせずにそれを行うことができます。

Object[] arr = new Object[10]; 
arr[1] = 1000; 
関連する問題