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。

4

1 回答 1

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 泛型的更多信息,我强烈建议您阅读泛型教程

于 2012-05-02T01:03:18.240 回答