简体   繁体   English

<E extends Number>和<Number>之间有什么区别?

[英]What is the difference between <E extends Number> and <Number>?

What is the difference between this method declaration: 这个方法声明有什么区别:

public static <E extends Number> List<E> process(List<E> nums){

and

 public static List<Number> process(List<Number> nums){

Where would you use the former? 你会在哪里使用前者?

The first allows process of a List<Integer> , a List<Double> , etc. The second doesn't. 第一个允许process List<Integer>List<Double>等。第二个不允许。

Generics in Java are invariant. Java中的泛型是不变的。 They're not covariant like arrays. 它们不像数组一样协变。

That is, in Java, Double[] is a subtype of Number[] , but a List<Double> is NOT a subtype of List<Number> . 也就是说,在Java中, Double[]Number[]的子类型,但List<Double>不是List<Number>的子类型。 A List<Double> , however, is a List<? extends Number> 但是List<Double>List<? extends Number> List<? extends Number> . List<? extends Number>

There are good reasons for generics being invariant, but that's also why the extends and super type are often necessary for subtyping flexibility. 泛型不变的原因很充分,但这也是extendssuper类型通常需要用于子类型灵活性的原因。

See also 也可以看看

The latter method (the one without <E extends Number> ) will only accept a parameter of exactly type List<Number> and will it always return a List<Number> . 后一种方法没有 <E extends Number> )只接受List<Number>类型的参数,并且它总是返回List<Number> For example, it will not accept List<Integer> . 例如,它接受List<Integer>

The former method (the one with <E extends Number> ) is a generic method , meaning it can accept different types of List s and it will return the same type of List , as long as the List s are lists of something that extends Number , eg List<Integer> . 前一种方法带有 <E extends Number> )是一种通用的方法 ,这意味着它可以接受不同类型的List S和将返还相同种类的List ,只要在List s的东西扩展列表Number ,例如List<Integer>

Example: 例:

import java.util.ArrayList;
import java.util.List;

public class ProcessGenerics {

    List<Number>  listNumber  = new ArrayList<Number>();
    List<Integer> listInteger = new ArrayList<Integer>();
    List<Double>  listDouble  = new ArrayList<Double>();


    public static
        List<Number> processWithoutExtends(List<Number> nums){ return nums; }

    List<Number>  resultN = processWithoutExtends(listNumber);  // OK
  //List<Integer> resultI = processWithoutExtends(listInteger); // compile-error - method not applicable
  //List<Double>  resultD = processWithoutExtends(listDouble);  // compile-error - method not applicable


    public static <E extends Number>
        List<E> processWithExtends(List<E> nums){ return nums; }

    List<Number>  resultN2 = processWithExtends(listNumber);  // OK
    List<Integer> resultI2 = processWithExtends(listInteger); // OK
    List<Double>  resultD2 = processWithExtends(listDouble);  // OK

}

See a similar explanation in the Wildcards chapter in the Generics Lesson in the Java Tutorials: 请参阅Java教程中的泛型课程中的通配符章节中的类似说明:
http://java.sun.com/docs/books/tutorial/java/generics/subtyping.html http://java.sun.com/docs/books/tutorial/java/generics/subtyping.html

See also How to cast a list of inheriting objects to a collection of objects in Java? 另请参见如何将继承对象列表转换为Java中的对象集合? Both questions are really about generics and subtypes, eg whether List<Integer> is a subtype of List<Number> (it's not!!!). 这两个问题都是关于泛型和子类型的,例如List<Integer>是否是List<Number>的子类型(它不是!!!)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 List <Number>和List <有什么区别?扩展数>? - What is the difference between List<Number> and List<? extends Number>? 之间有什么区别<? super E>和<? extends E> ? - What is a difference between <? super E> and <? extends E>? “有什么区别?” 延伸E“和”T延伸E“? - What is the difference between “? extends E” and “T extends E”? <?有什么区别? extends Object>和<E extends Object>? - What is difference between <? extends Object> and <E extends Object>? 泛型之间的区别 <T extends Number & Comparable<T> &gt;和T扩展可比 <? extends Number> - Difference between generics <T extends Number & Comparable<T>> and T extends Comparable<? extends Number> Java 通用类型:List 之间的区别<? extends Number>并列出<T extends Number> - Java Generic type : difference between List <? extends Number> and List <T extends Number> {0}和{0,数字,整数}之间有什么区别 - What is the difference between {0} and {0,number,integer} BaseButton有什么区别 <E> 和BaseButton <E extends BaseButton<E> &gt;? - What's the difference between BaseButton<E> and BaseButton<E extends BaseButton<E>>? Android 中扩展应用程序和扩展活动有什么区别? - What is the difference between Extends Application and Extends Activity in Android? 之间有什么区别<? extends Base>和<T extends Base> ? - What is the difference between <? extends Base> and <T extends Base>?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM