Foo find()-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:49:39 24 4
gpt4 key购买 nike

这是 Java 1.6 接口(interface):

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

这里有什么问题吗?

最佳答案

我可以编译一个工厂类:

    class MyFoo implements Foo<MyFoo> { }

Foo<MyFoo> foo = new Factory() {
public <T extends Foo<T>> Foo<T> find() {
return null;
}
}.find();

然而,这与该接口(interface)的实现一样有用,因为 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 的调用者可能需要澄清。

关于java - 如何在没有明确指定其参数的情况下返回泛​​型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5693659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com