<T延伸A> void foo(T t)和void foo(A a)之间的差异

Jap*_* D. 7 java generics

A是一个界面.有什么区别

public <T extends A> void foo(T t) { ... }
Run Code Online (Sandbox Code Playgroud)

public void foo(A a) { ...}
Run Code Online (Sandbox Code Playgroud)

Ami*_*far 8

使用一个对象没有区别.但想象一下,如果你有

class B extends A { ... }
Run Code Online (Sandbox Code Playgroud)

public void f(List<A> list) { ... };
Run Code Online (Sandbox Code Playgroud)

public <T extends A> void f(List<T> list) { ... };
Run Code Online (Sandbox Code Playgroud)

使用第一个,您可以传递一个完全类型的列表List<A>.使用第二个,您可以传递包含扩展对象的列表A.但是,第一个你不能做同样的事情.换句话说,你无法传递List<B>给第一种方法,但你可以传递给第二种方法.


Vic*_*kin 7

不多.

另一方面,请考虑以下方法:

public <T extends A> T transform(T t);
Run Code Online (Sandbox Code Playgroud)

和来电代码:

class B implements A { ... }
B result = transform(new B(...));
Run Code Online (Sandbox Code Playgroud)

如果您将方法声明result为,则不可能(上面不会编译,因为编译器会强制您声明类型为A)

public A transform(A a)
Run Code Online (Sandbox Code Playgroud)