这里有一个抽象类BaseA。
//class definition
public abstract class BaseA {
void doSomething();
}
并且有两个使用BaseA类的客户端,如下所示。
//the client A
class clientA {
void clientA(BaseA obj){
obj.doSomething();
}
...
//the client B
class clientB<T extends BaseA> {
void methodB(T obj){
obj.doSomething();
}
...
问题是两者之间有什么区别吗? 哪一个更好,为什么?请指教。 *问题不仅限于性能。
答案 0 :(得分:2)
ClientA
和ClientB
之间的区别在于ClientB
不仅受BaseA
的约束,而且还受T
的约束。由于T
无法缩小BaseA
中任何方法的范围,因此接口是相同的。
根据文档advantages of generics是:
- 更强类型检查
- 消除演员阵容
- 启用通用算法
如问题中所示,当限制使用泛型时,在这方面几乎没有好处。不过,更严格的类型检查适用于此。
主要区别在于T extends BaseA
强制将参数严格设置为T
类型。如果该类仅使用BaseA
,则BaseA
的任何子类都可以传递给该方法。
示例:
class SubA extends BaseA {}
class SubB extends BaseA {}
class ClientA {
void method(BaseA obj) {
obj.doSomething();
}
}
class ClientB<T extends BaseA> {
void method(T obj) {
obj.doSomething();
}
}
ClientA a = new ClientA();
a.method(new SubA());
a.method(new SubB());
ClientB<SubA> b = new ClientB<>();
b.method(new SubA());
b.method(new SubB()); // fails
虽然ClientA
允许传递任何BaseA
,但ClientB
允许将其用法限制为特定的子类型。