Java泛型-列表<&燃气轮机;vs列表<;T>;

Java泛型-列表<&燃气轮机;vs列表<;T>;,java,generics,Java,Generics,考虑以下两种备选API: void method(List<?> list) <T> void method(List<T> list) void方法(列表) 无效方法(列表) 我知道它们的内部实现将有许多差异需要处理,例如List无法写入列表等 另外,据我所知,List将允许使用List作为基本类型的任何参数化类型。列表的情况也是如此 有谁能告诉我这两个API接受哪种输入有什么不同吗。(不是两个API内部实现的差异。)内部实现完全相同。事实上,使用jav

考虑以下两种备选API:

void method(List<?> list)
<T> void method(List<T> list)
void方法(列表)
无效方法(列表)
我知道它们的内部实现将有许多差异需要处理,例如
List
无法写入列表等

另外,据我所知,
List
将允许使用
List
作为基本类型的任何参数化类型。
列表的情况也是如此

有谁能告诉我这两个API接受哪种输入有什么不同吗。(不是两个API内部实现的差异。)

内部实现完全相同。事实上,使用
javac
编译的两个方法都将产生相等的方法字节码(如果它们编译的话)

但是,在编译期间,第一个方法被指定为不关心列表的组件类型,而第二个方法要求组件类型是不变的。这意味着每当我调用这样一个方法时,
list
的组件类型将由调用站点使用的任何组件固定

我可以使用
列表
调用我的方法,
T
在调用过程中将与
String
同义(从编译器的角度)。我也可以用
列表调用它,在调用过程中
T
将与
Runnable
同义

请注意,您的方法不会返回任何内容,但它可以根据参数返回任何内容。考虑方法:

<T> T findFirst(Collection<T> ts, Predicate<T> p) { … }
此方法的工作原理与上面的相同,但在接受何种类型时会更加宽松。考虑类型层次<代码>扩展B扩展c<代码>。然后你可以打电话:

Collection<A> cs = …;
Predicate<C> p = …;
B b = findFirst(cs, p);

收集。

我相信他们会接受完全相同的输入。
的限制只在您尝试使用列表时出现,并且类型出于某种原因是相关的。我认为
列表
只添加了一个信息,即列表中不会添加任何元素(除了
null
s),请您在第二段中再详细说明一下好吗?我刚刚扩展了我的答案。谢谢,你们还并没有具体谈论这个列表。据我所知,从来电者的角度来看,您所说的关于列表的所有内容仍然适用于列表。我在寻找来电者看到的差异。
Collection<A> cs = …;
Predicate<C> p = …;
B b = findFirst(cs, p);