如何在没有明确说明其参数的情况下返回泛​​型类型?

时间:2011-04-17 13:04:23

标签: java generics

这是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

这里有什么问题?

1 个答案:

答案 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的来电者可能会批准澄清。