繁体   English   中英

为什么不能将子类型值分配给泛型类型?

[英]Why cannot assign a subtype value to a generic type?

谁能解释一下:

class Test<T extends BaseDao>{

    void someMethod(){
        T inst = new Dao();      // required type T provided Dao
        T inst2 = new BaseDao(); // required type T provided BaseDao
    }

}

class Dao extends BaseDao{}

我们有 T 类型作为 BaseDao 的子类型。 为什么不能将 Dao 或 BaseDao 类型分配给 T 类型?

T 可以是 Dao 的实例,但您不能像这样将 Dao 的新实例分配给泛型类型 T,因为 T 可以引用任何扩展 BaseDao 的类。

如果你需要一些特定的 Dao 实例,你应该这样做

Dao inst = new Dao()

相反,如果您确实想要一个特定的实例,但又不想知道特定的类,则可以将 inst1 和 inst2 作为参数传递,或传递一个字符串并按名称创建实例,或许多其他可能性。

简而言之, T inst = new Dao(); 没有意义,因为它与泛型的目的相冲突。

想象

Test<MySpecialDao> specialDao = new Test<>();

现在,对于像specialDao.someMethod()这样的调用,

void someMethod(){
    T inst = new Dao();      // required type T, provided Dao
    T inst2 = new BaseDao(); // required type T, provided BaseDao
}

有效地变成

void someMethod(){
    MySpecialDao inst = new Dao();      // required type MySpecialDao, provided Dao
    MySpecialDao inst2 = new BaseDao(); // required type MySpecialDao, provided BaseDao
}

当然, DaoBaseDao都不是MySpecialDao子类型,可能是超类型。

我会改为

void someMethod(){
    Dao inst = new Dao(); 
    BaseDao inst2 = new BaseDao();
}

希望此更改不会破坏您的预期逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM