2016-09-29 1 views
1

Я пытаюсь использовать Java generics-ClassCast исключений в Java, не может бросить на Ljava.lang.Integer

public T[] toArray() 
    { 


     T[] result = (T[])new Object[numberOfEntries]; 

     // some code here to fill the resultarray 



    return result; 
    } // end toArray 

Теперь в моей основной Funciton, это то, что я doing-

 A<Integer> obj= new A<Integer>(); 

     obj.add(1); //add method not shown here as it is not relevant to question 
     obj.add(2); 
     obj.add(3); 
     obj.add(4); 


     Integer arr[] = (Integer[]) obj.toArray(); 

я получаю следующее error-

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer; 
    at tester.main(tester.java:14) 

Как я могу это исправить?

ответ

4

Благодаря типа стирания, метод toArray() возвращает массив типа Object[], не Integer[], и это не представляется возможным, чтобы бросить Object[] до Integer[].

Если вы хотите вернуть Integer массив во время выполнения от вашего общего класса, вы можете попробовать переходящий в фактическом типе класса в качестве параметра для toArray() метода:

public T[] toArray(Class<T> c, int size) { 
    @SuppressWarnings("unchecked") 
    final T[] result = (T[]) Array.newInstance(c, s); 
    return result; 
} 

Использование:

A<Integer> obj= new A<Integer>(); 

obj.add(1); 
obj.add(2); 
obj.add(3); 
obj.add(4); 

Integer[] arr = obj.toArray(Integer.class, obj.size()); 
0

У вас есть эта строка в коде T [] result = (T []) new Object [numberOfEntries]; Вам нужно заменить его T [] result = (T []) новым T [numberOfEntries];

+0

формат, что ответить ..... – Antoniossss

+0

Я полагаю, вы не можете сказать 'новый T []' - вы пробовали это? –

6

Вы пытаетесь задать объект типа Object[] на номер Integer[]. Это несовместимые типы, поэтому JVM выбрасывает ClassCastException. Вы должны предоставить некоторую информацию о типе времени выполнения для toArray, например так:

public T[] toArray(Class<T> clazz) 
{ 
    @SuppressWarnings("unchecked") 
    T[] result = (T[])Array.newInstance(clazz, numberOfEntries); 
    // some code here to fill the resultarray 
    return result; 
} 

... 

// and use it like this: 
Integer arr[] = obj.toArray(Integer.class); 
0

Object[] не может быть отнесено к Integer[] напрямую. Используйте ниже код, чтобы переместить элементы один за другим:

Object[] arr = new Object[SIZE]; 
    Integer[] arr1 = new Integer[arr.length]; 
    int i = 0; 
    for(Object a:arr){ 
     arr1[i++] = (Integer)a; 
    } 
Смежные вопросы