2013-10-03 5 views
1

Когда я иду, чтобы запустить это я получаю сообщение об ошибке:Проблема с литья массив объектов обратно в массив целых чисел

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

public class Main 
{ 
    private interface Function<R, D> 
    { 
     public R apply(D parameter); 
    } 

    public static void main(String[] args) 
    {   
     // Example 1 
     Function<Integer, Integer> function = new CalculateSuccessor(); 
     Integer[] integerArray = {1, 3, 4, 2, 5}; 
     PrintArray(map(function, integerArray)); // map returns {2, 4, 5, 3, 6} <--- line 30 
    } 

    @SuppressWarnings({"unchecked"}) 
    public static <R, D> R[] map(Function<R, D> function, D[] array) 
    { 
     R[] results = (R[]) new Object[array.length]; 

     // Iterate through the source array, apply the given function, and record results 
     for (int i = 0; i < array.length; i++) 
     { 
      results[i] = (R)function.apply(array[i]); 
     } 

     return results; 
    } 

    public static <T> void PrintArray(T[] array) 
    { 
     for (T element : array) 
     { 
      System.out.println(element.toString()); 
     } 
    } 
} 
+0

Предположительно, строка 30 - это строка, которая говорит 'R [] results = (R []) new Object [array.length]; '? –

+0

Строка 30 - это когда я вызываю метод PrintArray. Приношу свои извинения за то, что не сказал. –

+1

Я предполагаю, что 'R' разрешается' Object', а не 'Integer', как вы ожидаете. Честно говоря, массивы и дженерики обычно не играют хорошо вместе. Если бы мне пришлось написать это, я бы сделал 'map' return' List 'вместо' R [] '- он просто кажется чище каким-то образом. –

ответ

0

Проблема заключается в результирующий массив создается как новый объект [array.length ]. Листинг (R []) не преобразует этот массив в другой тип, он просто сообщает компилятору относиться к нему как к R []. См. Quick Java question: Casting an array of Objects into an array of my intended class. Создание массива родового типа немного противно - вы можете google для различных решений, например. How to create a generic array in Java? - но, как правило, самым простым подходом является использование списка вместо массива: вы можете создать его с помощью нового ArrayList <R>

Смежные вопросы