gpt4 book ai didi

继承中的 Java 泛型

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:18:00 24 4
gpt4 key购买 nike

我在 java 的泛型方面遇到了一些(哲学上的?)问题......

考虑以下问题

public interface ClassA<I> {}

public class Obj implements ClassA<String> {}

public interface ClassB<I, T extends ClassA<I>> {
public I getSomething();
public T getAnotherThing();
}

如果 ClassB 的对象被实例化为:

ClassB<String, Obj<String>> o = new ClassB<>();
o.getSomething(); // <-- Returns String

我想知道是否有一种方法可以避免实例化 ClassB 对象而不必指定 String 泛型,因为它已经在 ClassA 中。更具体地说,我想将其用作:

public interface ClassB<T extends ClassA<I>> { // <-- Won't compile
public I getSomething();
}
ClassB<Obj> o = new ClassB<>();
o.getSomething(); // <-- Returns String from Obj declaration, which uses ClassA<String>

我知道“问题”可以通过第一个示例轻松解决,但我想知道是否有一种方法可以在实现的 ClassA 对象中引用泛型的实际类型,而不必在 ClassB 的声明中再次传递它,如果不是,为什么。

希望我对我的困境足够清楚。谢谢

最佳答案

我认为答案是否定的。 :)

Java 不提供从类型本身提取类型参数的方法,只能从具有该类型的参数中提取类型参数。

例如:

class ClassB<T extends ClassA<?>> {
<I> I getSomething(ClassA<I>) { ... }
}

... 工作正常,可以传递 T 的实例以提取 I。但是要从方法中删除参数(它仅用于确定 I 的类型),您需要一种从 T 本身确定 I 的方法,但没有这种方法。

通常,Java 中的类型推断仅限于在参数类型之间和/或参数与返回类型之间建立关系。

那么,另一种方法是将 IT 一起声明为一个通用参数的一部分,正如您尝试的那样:

public interface ClassB<T extends ClassA<I>>

但是,正如您所指出的,这也不被接受。需要扩展 Java 的语法才能实现这一点。

关于继承中的 Java 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32496701/

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