2012-05-02 2 views
1

Скажем, у меня есть абстрактный базовый класс, который имеет способ генерации объектов Foo (действует как заводский метод). Сейчас мои классы выглядят примерно так:Фабрично-подобный метод как метод абстрактного шаблона

public class Foo 
{ 
} 

public class FooBar extends Foo 
{ 
} 

public abstract class MyBaseClass 
{ 
    abstract public Foo createObject(); 
} 

public class MyDerivedClass extends MyBaseClass 
{ 
    @Override 
    public Foo createObject() 
    { 
     return new FooBar(); 
    } 
} 

Это неоптимальной, так как код, вызывающий MyBaseClass#createObject потребности бросить возвращаемое значение обратно к тому, что он был изначально, а именно:

FooBar fooBar = (FooBar)myDerivedClass.createObject(); 

Это как снять штаны, чтобы снова надеть их.

Я не использовал Java дженериков на некоторое время, но я надеялся, что я мог бы превратить этот абстрактный метод в шаблонный метод, что-то вроде:

public abstract class MyBaseClass 
{ 
    abstract public <T extends Foo> T createObject(); 
} 

Но я получаю следующие ошибки из Eclipse, когда я попытаться реализовать метод в производном классе:

public class MyDerivedClass extends MyBaseClass 
{ 
    @Override 
    public <FooBar extends Foo> FooBar createObject() // The type parameter FooBar is hiding the type FooBar 
    { 
     return new FooBar(); // Cannot instantiate the type FooBar 
    } 
} 

Я не думаю, что я применяю правильное решение моей проблемы сокращения ненужного литья происходит. Есть идеи?

Это с Java 1.6.

+0

Возможно, вам нужно понять эффекты стирания на Java-дженериках. http://docs.oracle.com/javase/tutorial/java/generics/erasure.html – esej

+0

related: http://stackoverflow.com/q/10127502/697449 –

ответ

3

Вы, вероятно, ищете универсальный класс (в отличие от общего метода):

public abstract class MyBaseClass<T extends Foo> { 
    public abstract T createObject(); 
} 

public class MyDerivcedClass extends MyBaseClass<FooBar> { 
    public FooBar createObject() { 
     return new FooBar(); 
    } 
} 

Чтобы узнать больше о Java генериков, я настоятельно рекомендую вам прочитать Generics tutorial.

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