我想实现一个通用方法,该方法应该创建一个双重通用对象的实例。
应该实例化的此类的通用类型是另一个类和第一个类型必须实现的接口。
当我在泛型方法中使用泛型类型调用new时,即使将类型正确限制在基本接口上,也会出现编译器错误Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
//some execution
}
};
timer.schedule(timerTask, 5000, 5000);
。
为什么我不能创建这样的实例?
CS0311
答案 0 :(得分:2)
假设您具有以下定义:
interface IEntityBase { }
interface ITESTEntity : IEntityBase { }
class TESTEntity : ITESTEntity { }
那么您的问题就出在这里:
class myQuery<T, I>
where T : class, I
where I : IEntityBase
您要说明T
必须可分配给I
,并且I
必须可分配给IEntityBase
。很好,但是在这里:
static void GetQuery<I>() where I : IEntityBase
{
var qry = new myQuery<TESTEntity, I>();
您接受任何可分配给I
的{{1}}。因此,您也可以这样称呼它:
IEntityBase
此调用将是有效的,但现在在您的方法interface ITESTEntity2 : IEntityBase { }
class TESTEntity2 : ITESTEntity2 { }
GetQuery<ITESTEntity2>();
中:
GetQuery()
new myQuery<TESTEntity, I>();
将是I
,ITESTEntity2
不可分配。无法保证TESTEntity
可分配给任何TESTEntity
,其中I
可分配给I
,如上面的IEntityBase
所示。
因此,请重新考虑您的设计。