在Java中是否有可能引用嵌套的泛型参数?

14

我不确定这个技术术语的确切名称,但请考虑一个接口:

public interface SomeInterface<T> {
     public T doSomething();
}

接着是第二个界面:

public interface SomeRelatedInterface<T, D extends SomeInterface<T>> {
     public T doSomethingRelated(D relative);
}

是否可以将第二个接口设计为只需要一个泛型参数,并在声明中隐式提取返回类型,以便doSomethingRelated方法实现。虽然这是不合法的,但我想知道是否有其他方法可以实现这一点:

public interface <T> SomeRelatedInterface<D extends SomeInterface<T>> {
     public T doSomethingRelated(D relative);
}

编辑(发布赏金时):目前我在这个问题上寻找的是语言需要这种重复的原因。这是迄今为止答案中缺失的内容,以便获得一个被接受的答案。


你为什么回滚到java-generics标签?这是现在该网站上唯一带有该标签的问题。 - Michael Myers
我回滚了它,因为我认为它适用于对Java泛型感兴趣的人,而不是一般的泛型作为语言概念。但如果它是该网站上唯一带有该标签的问题,那么确实没有什么用处。 - Yishai
还有可能再推一下吗?;)嗯,我觉得这是一个很好的问题,显然我已经点赞了它。 - Michael Myers
5个回答

2
public interface SomeRelatedInterface<T> {  
    T doSomethingRelated(SomeInterface<T> relative);
}

我一开始就是这样做的,但我想能够为相关的某个子类定义一个特定的SomeInterface,所以这并不能解决问题。 - Yishai

2
"目前我在这个问题上寻找的原因是语言要求这种重复。" 好的,您在此示例中需要定义两个类型参数,因为您描述的问题中有两个类型参数:您希望方法在类型T和SomeInterface的实现中都是可变的。这些是正交考虑因素,因此您需要多个类型参数来表示它们。当然,类型参数不需要在类/接口上定义;它们可以在方法上定义。J-16 SDiZ的答案允许您的相关类/接口仅具有一个类型参数。第二个类型参数仅在doSomethingRelated方法中声明。

T通常会从类型参数中推断出来,因此让一个实现该接口的类重新声明它似乎是多余的。在方法中使用没有问题,但在接口声明中使用就会有问题,这就是我提问的原因。 - Yishai

1

好的,我在这个问题上开始了一个悬赏,并不知道SO的行为是授予某人答案(恭喜丹尼尔),我以为声望会无法获得并且我会失去它。哦,算了。

无论如何,我终于有了答案。从这里

不幸的是,为了向后兼容,new Map()表示原始类型,因此不能用于类型推断。

所以基本上在创建类并传递类型参数时,类型推断被禁用以留出原始类型的空间。所以在我的情况下可能会有一些类型推断,但这将是一个更复杂的不同类型的类型推断来处理这种情况,这并没有完成。


0

看看这是否符合您的需求:

public interface SomeRelatedInterface<T> {
     public  <D extends SomeInterface<T>> T doSomethingRelated(D relative);
}

这样做不允许对D进行参数化,因此它可以是SomeInterface的任何实现,而不是特定的实现。 - Yishai
抱歉,无法实现您想要的。 - J-16 SDiZ

0

由于类型参数在编译时被擦除,所以我认为您不幸地无法在不指定T作为第二个类型参数的情况下实现您想要的效果,就像您在第一个示例中所做的那样。


3
我同意这可能是不可能的,但我不明白编译时擦除与此有什么关系——似乎仍然可以在编译时解决。 - Yishai
2
擦除与问题的措辞毫无关系。 - oxbow_lakes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接