在泛型类类型参数的方法(Parameterized methods in generic class

2019-07-31 04:30发布

我有一个相当简单的问题。 我无法找到通过搜索虽然一个答案。

有没有在这两个代码片段有区别吗? 而有什么区别?

片段1:

public class BinaryTree<T extends Comparable<? super T>> {
   ...
   public <E extends T> void add(E value) {
      ...
   }

   public <E extends T> void add(E value, Node node) {
      ...
   }
   ...
}

Fragment2:

public class BinaryTree<T extends Comparable<? super T>> {
   ...
   public void add(T value) {
      ...
   }

   public void add(T value, Node node) {
      ...
   }
   ...
}

片段1指定明确的是,参数必须是任一类型TT类型的子类型。

Fragment2指定,该参数必须是类型T的。 但是从我的小知识和经验,我觉得我还可以提供T的亚型这里。 因此,相同片段1。

我看着这两个片段的拆卸字节代码。 的确是有区别的:

<   public <E extends T> void add(E);
---
>   public void add(T);

这只是反映了源代码...

我只是不明白的意思。 而且我也无法找到一个示例应用程序,它显示的差异。

感谢您的意见。

Answer 1:

在这种情况下是没有区别的。 让我们例如BinaryTree<Number> ,然后尝试在一个Integer

BinaryTree<Number> numTree = new BinaryTree<>();
Integer i = 1;
numTree.add(i);

随着片段1, E可以评估到Integer ,但是这是在这种情况下是多余的。 Integer 是一个 Number ,你也可以同样指定NumberE

numTree.<Number>add(i);

出于这个原因,第二片段是不大于所述第一不同的,并且为不声明一个不必要的类型参数更少混淆。


在有些情况下额外的类型参数将是有益的情况。 想象一下,由于某种原因,你想返回值传递的:

public <E extends T> E add(E value) {
   ...
   return value;
}

public <E extends T> E add(E value, Node node) {
   ...
   return value;
}

现在,这将是给调用者有用:

Integer i2 = numTree.add(i);

随着第二个片段,是不可能的,而且numTree.add只能返回一个Number ,即使你在通过Integer



Answer 2:

没有,有两个变化之间没有差别add()方法。 Java的方法参数已经建立所接受的类型,它是通过使用完成的相同约束的上限 extends你的类型可变的形式<E extends T>

你的类型变量不增加新的信息,也不会增加任何额外的限制。 这已经是合法的传递类型的参数T 或延伸的任何类型的T 。 你的类型变量<E extends T>确实提供了一种参照实际的参数类型再次-说,如果有,你要确保是相同类型的第一,但在你的情况的第二个方法的参数,你“再没有利用的E



文章来源: Parameterized methods in generic class type