说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)
?
使用一个对象没有区别.但想象一下,如果你有
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>给第一种方法,但你可以传递给第二种方法.
不多.
另一方面,请考虑以下方法:
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)
| 归档时间: |
|
| 查看次数: |
1075 次 |
| 最近记录: |