Java泛型:方法声明参数中的类型扩展

Sch*_*mer 5 java generics wildcard

我正在学习Java Generics.我的理解是Generics按类型参数化集合.在Oracle教程中,有以下注释:

在通用代码中,称为通配符的问号(?)表示未知类型.

在下一页中,下面是参数中带有上限通配符的方法声明示例:

public void process(List<? extends Foo> list)
Run Code Online (Sandbox Code Playgroud)

鉴于此,我想知道为什么这个方法声明是非法的:

public void process(List<E extends Number> list)
Run Code Online (Sandbox Code Playgroud)

虽然这是合法的:

public <E extends Number> void process(List<E> list)
Run Code Online (Sandbox Code Playgroud)

Ali*_*ito 5

指定方法parm类型时,您使用的是泛型类型,因此必须事先定义它.在此语句中,您使用E而无需定义

public void process(List<E extends Number> list) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

但是,在第二个中,它是在方法返回类型(void)之前定义的:

public <E extends Number> void process(List<E> list) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

  • 但是通配符是在JVM中定义的.这是一种特殊情况,内置于语言中.另一方面,T是你提出的,所以你必须告诉Java在使用之前是什么.它可能只是<T>或更受限制<T extends Number>,但必须在使用前定义. (2认同)