【问题标题】:What are the differences between normal polymorphism and the one using generic?普通多态性和使用泛型的多态性有什么区别?
【发布时间】:2019-12-21 00:12:37
【问题描述】:

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

    }
    ...

请问这两者有什么区别吗? 哪个更好,为什么?请指教。 *问题不限于表演。

【问题讨论】:

  • 这能回答你的问题吗? Java generic Interface performance
  • 感谢您的页面。部分是的,但我需要更多信息。
  • 还有什么信息?
  • 我想知道在哪种情况下,我应该使用哪一种。
  • Base 班级在哪里?

标签: java performance oop polymorphism


【解决方案1】:

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 允许将其使用限制为特定的子类型。

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 2012-07-15
    • 2016-09-30
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    相关资源
    最近更新 更多