是否可以在java中引用嵌套的泛型参数?

时间:2009-06-15 15:50:22

标签: java generics

我不确定这个术语是什么,但考虑一个界面:

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);
}

编辑(在发布赏金时):此时我在这个问题上寻找的是语言需要这种复制的原因。到目前为止,答案中已经缺少这一点,以便接受一个。

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

  

“此时我在这个问题上寻找的是语言需要重复的原因”

嗯,该语言要求您在示例中定义2个类型参数,因为在您描述的问题中有2个类型参数:您希望方法在类型T SomeInterface的实施中也是。

这些是正交注意事项,因此您需要多个类型参数来表示它们。

类型参数当然不需要在类/接口上定义;它们可以在方法上定义。 J-16 SDiZ 的答案允许您的相关类/接口只有一个类型参数。然后,在doSomethingRelated方法

上,仅在需要时声明第二个类型参数

答案 2 :(得分:1)

好吧,我开始对这个问题表示赏心悦目,并且不知道SO的行为是给某人一个答案(祝贺丹尼尔),我认为代表会没有报酬,我会失去它。哦,好吧。

无论如何,我终于得到了答案。来自here

  

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

由于类型参数在编译时被删除,恕我直言,遗憾的是,如果不将T指定为第二个类型参数,就无法实现您想要的效果,就像您在第一个示例中所做的那样。