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
是动物
,但是动物
并不总是狗
,同样地:typeT
是扩展BaseDao
的类型,但并不是所有属于或扩展BaseDao
的东西都是T
。就是这样!谢谢!您可能想看看T super-BaseDao
。
void someMethod(){
Dao inst = new Dao();
BaseDao inst2 = new BaseDao();
}