代码之家  ›  专栏  ›  技术社区  ›  Yishai

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

  •  14
  • Yishai  · 技术社区  · 17 年前

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

    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 回复  |  直到 17 年前
        1
  •  2
  •   Daniel Moura    17 年前
    public interface SomeRelatedInterface<T> {  
        T doSomethingRelated(SomeInterface<T> relative);
    }
    
        2
  •  2
  •   oxbow_lakes    17 年前

    “在这一点上,我在这个问题上寻找的是该语言需要这种复制的原因”

    这个语言要求你在例子中定义两个类型参数,因为你描述的问题中有两个类型参数:你希望一个方法在两个类型中都是变量 T 而且 在执行 SomeInterface .

    这些是 正交考虑

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

        3
  •  1
  •   Yishai    17 年前

    好吧,我开始悬赏这个问题,不知道苏的行为是奖励某人答案(恭喜丹尼尔),我以为代表会得不到回报,我会失去它。哦,好吧。

    不管怎样,我终于有了答案。从…起 here :

    因此,基本上在创建类并传入类型参数时,类型推断被禁用,以便为原始类型留出空间。所以在我的例子中,可能会有一些类型推断,但这将是一个更复杂的不同类型的类型推断来处理这个案例的问题,而这并没有完成。

        4
  •  0
  •   J-16 SDiZ    17 年前

    public interface SomeRelatedInterface<T> {
         public  <D extends SomeInterface<T>> T doSomethingRelated(D relative);
    }
    
        5
  •  0
  •   Daniel Schneller    17 年前

    由于类型参数在编译时被擦除,很遗憾,如果不指定T作为第二个类型参数,您就无法实现所需的功能,就像您在第一个示例中所做的那样。