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



A为接口。

和 的区别是什么?
public <T extends A> void foo(T t) { ... }

public void foo(A a) { ...}

?

使用一个对象时没有区别。但是想象一下如果你有

class B extends A { ... }

public void f(List<A> list) { ... };

public <T extends A> void f(List<T> list) { ... };

与第一个,你可以传递一个列表,正是类型List<A>。对于第二个,你可以传递一个列表,其中包含扩展A的对象。然而,对于第一个,你不能做同样的事情。换句话说,你不能把List<B>传递给第一个方法,但是你可以传递给第二个方法。

没什么。

另一方面,考虑这个方法:

public <T extends A> T transform(T t);

和呼叫者代码:

class B implements A { ... }
B result = transform(new B(...));

如果您将方法声明为

,这是不可能的(上面不会编译,因为编译器会强制您将result类型声明为A)。
public A transform(A a)

在您的情况下没有区别,因为类型参数只在一个地方使用。这两种方法都将接受A或扩展A的任何内容。泛型方法在这种情况下更有意义,因为类型参数允许您将返回值绑定到传递的参数:

public <T extends A> T f(Class<T>) {...}

最新更新