JavagenericsWildCard:<? 扩展Number> vs <T extends Number>

这两个函数有什么区别?

static void gPrint(List<? extends Number> l) { for (Number n : l) { System.out.println(n); } } static <T extends Number> void gPrintA(List<T> l) { for (Number n : l) { System.out.println(n); } } 

我看到相同的输出。

4 Solutions collect form web for “JavagenericsWildCard:<? 扩展Number> vs <T extends Number>”

在这种情况下没有区别,因为T不再被使用。

声明一个T的原因是你可以再次引用它,从而绑定两个参数types,或者一个返回types。

不同之处在于使用通配符时不能引用T

你现在不是这样,所以没有什么区别,但是你可以用T来做出改变:

 static <T extends Number> T getElement(List<T> l) { for (T t : l) { if (some condition) return t; } return null; } 

这将返回相同的types ,例如,这些都将被编译:

 Integer x = getElement(integerList); Float y = getElement(floatList); 

T是一个有界的types,也就是你使用的任何types,你必须坚持延伸Number那个特定的types,例如,如果你传递一个Doubletypes到一个列表,你不能将它传递给Shorttypes,因为TDoubletypes的,列表已经被该types所限制。 相反,如果你使用?wildcard ),则可以使用扩展Number “任意”types(将ShortDouble添加到该列表中)。

当您使用T时,您可以在列表上执行所有types的操作。 但是,当你使用你不能执行添加。

T – 与完全访问的对象引用相同
? – 部分访问

 static void gPrint(List<? extends Number> l) { l.add(1); //Will give error for (Number n : l) { System.out.println(n); } static <T extends Number> void gPrintA(List<T> l) { l.add((T)1); //We can add for (Number n : l) { System.out.println(n); } 
  • OrderedDictionary没有generics实现?
  • 性能:从generics派生的types
  • C#genericstypes约束的一切可为空
  • C# - 使用List <T> .Find()与自定义对象
  • 如何将parameter passing给Activator.CreateInstance <T>()
  • 检查“T”是inheritance还是实现一个类/接口
  • 与generics拳击和拆箱
  • 谷歌Gson - 反序列化列表<class>对象? (通用型)
  • 任何简单的方法来解释为什么我不能做的List <Animal> animals = new ArrayList <Dog>()?
  • 转换List(of object)到List(of string)
  • c#比较两个通用值