2014-02-12 5 views
1

Рассмотрим базовый класс:Создание списка экземпляров производных от общего абстрактного класса

public abstract class TestGenericList<T> { 

    public TestGenericList() { 
    } 

    protected abstract void doSomething(); 
} 

Теперь, два производных классов: класс

public class DerivedA extends TestGenericList<DerivedA> { 

    @Override 
    protected void doSomething() { 
     // 
    } 
} 
public class DerivedB extends TestGenericList<DerivedB> { 

    @Override 
    protected void doSomething() { 
     // 
    } 
} 

Применение:

public class TestListMain { 

    public static void main(String[] args) { 
     DerivedA dA = new DerivedA(); 
     DerivedB dB = new DerivedB(); 

     List<TestGenericList> genericList = new ArrayList<TestGenericList>(); 
     genericList.add(dA); 
     genericList.add(dB); 
    } 
} 

Строка со списком создает это предупреждение:

TestGenericList is a raw type. References to generic type TestGenericList<T> should be parameterized 

Как я могу сгенерировать список производных от общего абстрактного базового класса?

ответ

2

Информация о типе будет потеряна, если вы добавите оба типа в список. Таким образом, вы узнаете только, что в списке содержится TestGenericList объектов незарегистрированного типа <?>.

List<TestGenericList<?>> genericList = new ArrayList<TestGenericList<?>>(); 

Этого может быть достаточно в вашем случае, но вы всегда должны думать о том, хотите ли вы этого. Почему вы представили информацию о типе, когда она потерялась позже? Бывают случаи, когда это имеет смысл. Например. взгляните на Collections.disjoint(Collection<?> c1, Collection<?> c2).

+0

Это то, что я искал, thx! – Juergen

2

TestGenericList<T> является типичным объявлением типа, и вы используете это как необработанный тип. Здесь вы должны использовать TestGenericList<DerivedA> или TestGenericList<?>, чтобы удалить предупреждение.

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