Java 为什么不能将子类型值指定给泛型类型?

Java 为什么不能将子类型值指定给泛型类型?,java,generics,Java,Generics,谁能解释一下: 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{} 类测试{ voi

谁能解释一下:

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{}
类测试{
void方法(){
T inst=new Dao();//所需类型T提供的Dao
T inst2=new BaseDao();//所需类型T提供的BaseDao
}
}
类Dao扩展了BaseDao{}
我们将T类型作为BaseDao的子类型。
为什么不能将Dao或BaseDao类型分配给T类型?

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

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

Dao inst = new Dao()
如果您确实想要一个特定的实例,但不想知道特定的类,那么可以将inst1和inst2作为参数传递,或者传递一个字符串并按名称创建实例,或者其他许多可能的方法

简而言之,
T inst=newdao()毫无意义,因为它与泛型的目的相冲突。

想象一下

Test<MySpecialDao> specialDao = new Test<>();
有效地成为

void someMethod(){
    MySpecialDao inst = new Dao();      // required type MySpecialDao, provided Dao
    MySpecialDao inst2 = new BaseDao(); // required type MySpecialDao, provided BaseDao
}
当然,
Dao
BaseDao
都不是
MySpecialDao
的子类型,可能是超类型

我想换成

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

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

因为如果
t
BaseDao
的其他子类型,则赋值将无效。如果您特别要求
T
成为
Dao
,那么它不是一个通用参数。因为
Dog
动物
,但是
动物
并不总是
,同样地:type
T
是扩展
BaseDao
的类型,但并不是所有属于或扩展
BaseDao
的东西都是
T
。就是这样!谢谢!您可能想看看
T super-BaseDao
void someMethod(){
    Dao inst = new Dao(); 
    BaseDao inst2 = new BaseDao();
}