这是Java 1.6界面:
interface Foo<T extends Foo<T>> {
}
这是一家工厂,应该返回"Foo<Foo>"
:
interface Factory {
<T extends Foo<T>> Foo<T> find();
}
无法编译工厂类:
incompatible types; inferred type argument(s) java.lang.Object do not conform
to bounds of type variable(s) T
[ERROR] found : <T>Foo<T>
[ERROR] required: java.lang.Object
这里有什么问题?
答案 0 :(得分:2)
我可以编译一个工厂类:
class MyFoo implements Foo<MyFoo> { }
Foo<MyFoo> foo = new Factory() {
public <T extends Foo<T>> Foo<T> find() {
return null;
}
}.find();
但是,由于find()
中的代码无法在任何特定的调用中发现T
代表什么,因此无法实例化该接口的实现。 T
。
如果您的工厂只应创建特定类型的实例,请为工厂提供类型参数:
interface Factory<T> {
T find();
}
class MyFactory implements Factory<MyFoo> {
MyFoo find() { return new MyFoo(); }
}
如果它创建了任意类型的实例,请将期望的类型传递给find()
:
class Factory {
<T extends Foo<T>> find(Class<T> clazz) {
return clazz.newInstance();
}
}
MyFoo myFoo = new Factory().find(MyFoo.class);
最后,请注意工厂在存储库找到对象时创建对象。您是在宣布存储库还是工厂?您的API的来电者可能会批准澄清。