工厂式方法作为抽象模板方法

时间:2012-05-02 00:59:49

标签: java generics

假设我有一个抽象基类,它有一个生成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。

1 个答案:

答案 0 :(得分: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