2014-11-11 3 views
2

Я ищу реализовать общий класс, который имеет два поля:Как создать клон массива через общий подстановочный знак в Java?

class A<E>{ 
    private final E[] values; 
    private final int size; 
    //default constructor 
    public A(){ 
     values = (E[]) new Object[0]; 
     size = 0; 
    } 
} 

Теперь я хочу ввести конструктор копирования, который реплицируется в родовой Объекте неизвестного типа. Что-то вроде этого:

class A<E>{ 
    private final E[] values; 
    private final int size; 
    //default constructor 
    public A(){ 
     values = (E[]) new Object[0]; 
     size = 0; 
    } 

    //the copy constructor 
    public A(A<?> a){ 
     //Code here 
    } 
} 

Основная идея заключается в том, чтобы использовать подстановочные захвата вспомогательной функции как

private <T> T[] copyHelper(A<T> originalA){ 
    T[] originalValue = originalA.value; 
    T[] copy = Arrays.copyOf(originalValue, 0); 
    return copy; 
} 

, а затем в конструктор копирования делать

public A(A<?> a){ 
    value = (A[]) copyHelper(a); 
    size = a.size; 
} 

служит ли это цель? Не отличает ли возвращаемое значение от copyHelper() до E[] излишним? Как еще я могу получить копию пройденного объекта A<?>, тип которого неизвестен?

+1

Вы не должны копировать экземпляр, который не соответствует типу, который вы хотите. 'A ' кажется неправильным, предпочитая 'A '. – Makoto

+0

Как же, следует ли мне приступить к реализации конструктора копирования, если пользователь хочет создать экземпляр класса с объектом другого типа (другой общий класс) - класс, отличный от 'E'? – jigsawmnc

+0

Я думаю, что это был бы отличный вопрос. Вероятно, вы должны снова отправить сообщение. – markspace

ответ

5

Либо переданный экземпляр имеет тип A<E>, и в этом случае вы можете его скопировать, или его нет, и в этом случае вы не можете его скопировать в экземпляр типа A<E>. Поэтому нет смысла разрешать A<?> как тип ввода: вы должны ограничить его A<E>.

Фактически вы можете ограничить его A<? extends E>, так как они по-прежнему совместимы с E.

Попытка воспроизвести что-либо еще здесь не имеет смысла, не более, чем конструктор HashSet может взять параметр копирования типа int[].