2015-12-08 4 views
0

Это простой пример для демонстрации проблемы.Сложная общая декларация класса

У нас есть следующие классы:

public abstract class Engine { } 

public class DieselEngine extends Engine { } 
public class PetrolEngine extends Engine { } 

Давайте создадим несколько заводов, которые производят двигатели:

public abstract class EnginesFactory <T extends Engine> { 

    public List<T> produceEngines() { 
     return null; 
    } 
} 

public class DieselEnginesFactory extends EnginesFactory <DieselEngine> { } 
public class PertolEnginesFactory extends EnginesFactory <PetrolEngine> { } 

Вопрос:

Как создать универсальный класс, который принимает EngineFactory подклассы? Нечто подобное, ниже которого не работает, но создается, чтобы показать мои потребности:

public abstract class TestFactory <T extends EnginesFactory<R extends Engine>> { //R extends Engine is wrong 

    public void testFactory(T factory) { 
     testEngines(factory.produceEngines()); 
    } 

    protected abstract void testEngines(List<R> engines); 
} 

ответ

1

Вы должны объявить R в качестве второго параметра типа с его собственной границей, так что вы можете обратиться к R при объявлении T ,

public abstract class TestFactory<R extends Engine, T extends EnginesFactory<R>> { 

(я предполагаю, что вы имели в виду public abstract class, не public class abstract.)

+0

Спасибо! Это правильный ответ :) Я также редактировал вопрос, чтобы исправить найденную ошибку. – Hubert

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