2013-02-22 3 views
1

Есть ли способ, чтобы передать массив ограниченного общего типа для метода с аргументом одного и того же общего типа, не поднимая ClassCastException ?:Передача общего массива в конструкторе

public class Heap<E extends Comparable> implements java.lang.Cloneable{ 

    private java.util.ArrayList<E> list = new java.util.ArrayList<E>(); 

    public Heap(E[] objects) { 
     for (int i = 0; i < objects.length; i++) { 
      add(objects[i]); 
     } 
    } 

    private void add(E newObject){ 
    ... 
    } 

    @Override 
    protected Heap<E> clone() { 
     return new Heap<E>((E[])list.toArray()); 
    } 
} 
+3

Что проблема с этим кодом? – Shivam

+1

Где вы сейчас получаете ClassCastException? По крайней мере, предоставленные элементы массива должны реализовывать интерфейс Comparable. –

+0

Вы забыли рассказать нам, где происходит исключение ... это в клоне, правильно? – home

ответ

0

Если вы нормально со всеми непроверенными слепками, которые должны сделать это:

class Heap<E extends Comparable> implements java.lang.Cloneable{ 

    private java.util.ArrayList<E> list = new java.util.ArrayList<E>(); 
    Class<E> classE; 

    public Heap(E[] objects) { 
     Class<? extends Object[]> aClass = objects.getClass(); 
     this.classE = (Class<E>) aClass.getComponentType(); 
     for (int i = 0; i < objects.length; i++) { 
      add(objects[i]); 
     } 
    } 

    private void add(E newObject){ 
     ... 
    } 

    @Override 
    protected Heap<E> clone() { 
     return new Heap<E>(list.toArray((E[])Array.newInstance(classE, list.size()))); 
    } 
} 
-1
return new Heap<E>((E[])list.toArray()); 

Нет , массивы не могут быть типом (ну, только от Object).

Используйте вместо этого:

return new Heap<E>(list.toArray((E[])new Comparable[0])); 

(Предполагая, что вы используете ограниченный тип Comparable, в противном случае используйте:

return new Heap<E>(list.toArray((E[])new Object[0])); 

)

Это возвратит массив типа E[].

+1

Новый 'новый E [0]' wont компилируется, поскольку вы не можете создавать типичные массивы. – home

+0

@home см. Редактировать ... – Mordechai

+0

спасибо ... btw - я не спускал вниз. – home

1

Effective Java Джошуа Блоха (пункт 25):

Это незаконно, чтобы создать массив универсального типа, параметризованного типа, или типа параметра. Ни одно из этих выражений создания массива не является законным новым List<E>[], новым List<String>[], new E[].

Так что используйте списки вместо массивов с дженериками.

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