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