2014-10-16 3 views
0

Я пытаюсь реализовать этот код. Аренда - это подкласс Transaction.Параметр типа X скрывает тип X

import java.util.LinkedList; 
public class TransactionList<Transaction> extends LinkedList { //TransactionList: warning: The type parameter Transaction is hiding the type Transaction 

public TransactionList<Rent> getRentTransactions(){ 
    TransactionList<Rent> rentList = new TransactionList<Rent>(); 

    for(Transaction t : this){ //this: error: Type mismatch: cannot convert from element type Object to Transaction 
     if(t instanceof Rent){ 
      t = (Rent) t; //this: warning: Type mismatch: cannot convert from Rent to Transaction 
      rentList.add((Rent) t);// whole statement: warning: Type safety: The method add(Object) belongs to the raw type LinkedList. References to generic type LinkedList<E> should be parameterized 
     } 
    } 
    return rentList; 
} 

Я действительно потерял с этим, я абсолютно уверен, что этот код типобезопасен в любой данный TransactionList всегда будет содержать сделки или подкласс сделки.

Однако, если я изменю для постановки на

for(Object t : this) 

будет компилировать. Однако все объекты, хранящиеся в возвращаемом TransactionList, будут иметь тип Object и не могут быть отправлены в объекты Rent.

+0

Да точно, извините за замешательство – nitowa

ответ

2

вас, скорее всего, имел в виду

public class TransactionList extends LinkedList<Transaction> { 

Что вы имели

public class TransactionList<Transaction> extends LinkedList { 

объявляет новую переменную типа с именем Transaction. Таким образом, это эквивалентно

public class TransactionList<T> extends LinkedList { 

и объявление родительского класса является необработанным. Read this to understand when and when not to use raw types. В этом случае параметр типа, который вы назвали Transaction, скрывает конкретный тип, также называемый Transaction.

Вы не можете сделать это

for(Transaction t : this) 

потому что this является Iterable по наследству (extends LinkedList), но так как это сырье тип, тип стирается в Object. Object не является присвоением, совместимым с параметром типа Transaction.

+0

Спасибо за отличное разъяснение. Теперь я чувствую себя глупо! :) – nitowa

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