Andy已经描述了如何解决这个问题,我会尽力解释原因。
S
不保证可指定为MyAbs
,只能指定为AbsClass
,每个实例将指定AbsClass
的子类。
考虑:
class MyOtherAbs extends AbsClass {}
MyClass myClass = new MyClass<MyOtherAbsClass>{};
这跟你有什么冲突。
UPDATE:
根据您的意见,它看起来像你想实现以上。挑战是如果MyOtherAbs
有一个带参数的构造函数?或者被实现为单例(即私有构造函数和静态getInstance()
)。总之,没有保证统一的方式可以构建这些。此外,由于类型擦除,在运行时,S的概念没有了,所以你不能这样做:
return new S();
你基本上有两种选择,一种是使用子类:
public interface AbsClassFactory<S extends AbsClass>{ //takes the place of MyClass
public S getInstance();
}
MyAbsFactory implements AbsClassFactory<MyAbs>{
public MyAbs getInstance(){
return new MyAbs(); //or however MyAbs is instantiated
}
}
另一种选择是反思:
class MyClass {
public <S extends AbsClass> S getObj(Class<S> clazz) throws InstantiationException, IllegalAccessException {
return clazz.newInstance();
}
}
注意,第二个假设有可用的无参数的构造函数,将抛出一个运行时异常,如果一个不是。
删除'
',并更改单曲getObj()'要么'MyAbs getObj( )'或'AbsClass getObj()'。就目前而言,没有理由有一个类型变量。 –你能说出“做这个”时你想要什么吗? – Simon
我希望能够初始化MyClass,然后调用getObj(),它将返回MyAbs对象。随着安迪的回答,我将不得不将AbsClass投给MyAbs或MySecondAbs,这正是我试图避免的 –
mwong56