正常的多态性和使用通用的多态性有什么区别?

时间:2019-12-21 00:12:37

标签: java performance oop polymorphism

这里有一个抽象类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();

    }
    ...

问题是两者之间有什么区别吗? 哪一个更好,为什么?请指教。 *问题不仅限于性能。

1 个答案:

答案 0 :(得分:2)

ClientAClientB之间的区别在于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允许将其用法限制为特定的子类型。