泛型类型和通配符之间的区别将参数类型扩展到方法

时间:2016-11-07 06:56:50

标签: java generics

当我尝试使用通配符将参数设置为扩展数时,如下面的代码所示 -

import java.util.*;

class Try {
    public static void main(String [] args) {
        List <Integer>a = new ArrayList<>();
        a.add(1);
        a.add(2);
        a.add(3);
        System.out.println(foo(a));
    }

    public static double foo(List<? extends Number> list) {
        double x = 0.0;
        for (Object e : list)
            x += (Integer) e;
        return x;
    }
}

编译好。 但是,如果我使用泛型类型,如此处所示 -

import java.util.*;

class Try {
    public static void main(String [] args) {
        List <Integer>a = new ArrayList<>();
        a.add(1);
        a.add(2);
        a.add(3);
        System.out.println(foo(a));
    }

    public static <T extends Number> double foo(List<T extends Number> list) {
        double x = 0.0;
        for (Object e : list)
            x += (Integer) e;
        return x;
    }
}

我收到以下语法错误 -

Try.java:12: error: > expected
    public static <T extends Number> double foo(List<T extends Number> list) {
                                                       ^
Try.java:12: error: ')' expected
    public static <T extends Number> double foo(List<T extends Number> list) {
                                                              ^
Try.java:12: error: ';' expected
    public static <T extends Number> double foo(List<T extends Number> list) {
                                                                     ^
Try.java:12: error: <identifier> expected
    public static <T extends Number> double foo(List<T extends Number> list) {
                                                                           ^
4 errors

为什么第二种情况会给我一个错误?在这种情况下,泛型和通配符有什么区别?

2 个答案:

答案 0 :(得分:1)

你写的是无效的语法。这就是你的意图:

public static <T extends Number> double foo(List<T> list) {

也就是说,extends属于类型标记定义,而不属于方法参数列表中的类型声明。

答案 1 :(得分:0)

假设在你的第二段代码中你的意思是:

use

两个声明之间没有区别。可以传递给一个函数签名的任何类型都可以传递给另一个,反之亦然。其中use CPANpublic static <T extends Number> double foo(List<T> list) 的非严格子类型的每种可能类型List<T>都是T的子类型。并且Number可以List<? extends Number>List<? extends Number>一起被捕获。所以两者完全等价。