2015-05-22 12 views
5

Java 7 jeneriklerini öğreniyorum, Cay Horstmann'ı okuyoruz, Core Java7, Cilt I, sayfa 716. Neden çalışma zamanı hatası anlayamıyorum yasadışı) oluşur, lütfen aşağıdaki kodlara bakın. Bana bunu Cay'ın yaptığıdan daha iyi anlatabilir mi? Oluşturduğunuz fiili tipi, Object[] bir Comparable DEĞİLDİR çünküCay Horstmann'dan Java jenerikleri, Temel Java 7, Cilt I, sayfa 716

public class ProcessArgs 
{ 

    public static <T extends Comparable> T[] minmax(T... a) 
    { 
    Object[] mm = new Object[2]; 
    mm[0] = a[0]; 
    mm[1] = a[1]; 
    if (mm[0] instanceof Comparable) 
    { 
     System.out.println("Comparable"); // this is True, prints Comparable at run-time 
    } 
    return (T[]) mm; // run-time error here 

    /* Run-Time ERROR as below: 
    ComparableException in thread "main" 
    java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable; 
     at ProcessArgs.minmax(ProcessArgs.java:13) 
     at ProcessArgs.main(ProcessArgs.java:18) 
    */ 

    } 

    public static void main(String[] args) 
    { 
    String[] sa = minmax("Hello","World"); // ERROR, illegal cast 
    System.out.println(sa[0] + sa[1]); 
    Object o = "Hello World"; //works - if we comment out the method call to minmax above 
    Comparable<String> s = (Comparable) o; // works 
    Comparable s2 = (Comparable) o; // works 
    System.out.println(s + " " + (String) s2); // works 
    return; 
    } 
} 

cevap

5

Bu hata verir. Java jenerikleri dizilerle oldukça zayıf bir şekilde ilgilenir, mümkünse koleksiyonları kullanmaya çalışmalısınız. Bu iki hat Verilen

T[] mm = (T[]) Array.newInstance(a[0].getClass(), 2); 

:

Object o = "Hello World"; //works - if we comment out the method call to minmax above 
Comparable<String> s = (Comparable) o; // works 

dize "Hello World" aslında Comparable çünkü ikinci satır çalışan bu durum için, yansıma kullanarak uygun türde bir dizi oluşturabilirsiniz.

Ancak Object[], türü Object[] değil, bu nedenle kullanılamaz.

+0

Ancak ifade: if (mm [0] instanceof Karşılaştırılabilir) doğru döndürür, kodumda, T ... a'nın genel tür silme değeri Karşılaştırılabilirdir. –

+0

ayrıca: Bunu Object [] 'den şuna değiştirirsem: Karşılaştırılabilir [] mm = new Comparable [2]; Object [] yerine hala çalışma zamanında hata alıyorum [Ljava.lang.Comparable; [Ljava.lang.String; –

+0

mm [0] dizideki bir öğedir. Dizinin kendisi değil, kodda daha sonra yayınlamaya çalıştığınız şey bu. – markspace

1

Sadece ipucu vermek için, aşağıdaki kodu karşılaştırabilir ve bu kodda neler olduğunu anlayabilirsiniz.

Object[] mm = new Object[2]; // reference type Object array and object type object array. 
mm[0] = a[0]; // putting String value into 0th position, so it is comparable, 
// but whole array is of type Object, so it is not able to cast it to String array while returning. 

Object o = "Hello World"; // reference type Object and object type String 
Object o = new String("Hello World"); // this code is also similar to above line. 

Not: String nesnesi dizisi karşılaştırılabilir değil.