Java泛型捕获组

Java泛型捕获组,java,generics,nested-generics,Java,Generics,Nested Generics,我无法正确使用Java捕获组 假设我有这些课程: class Foo{} class Bar{} interface InterfaceXYZ<T>{ void doSomething(T t); } class FooImplementation implements InterfaceXYZ<Foo>{ @Override void doSomething(Foo){} } 这无法正常工作(如预期的那样)-导致运行时异常 FooImplementati

我无法正确使用Java捕获组

假设我有这些课程:

class Foo{}
class Bar{}

interface InterfaceXYZ<T>{ 
  void doSomething(T t);
}

class FooImplementation implements InterfaceXYZ<Foo>{
  @Override void doSomething(Foo){}
}
这无法正常工作(如预期的那样)-导致运行时异常

FooImplementation fi = new FooImplementation();
Delegator d = new Delegator(fi);
d.doSomething(new Bar());

为什么它不抛出编译时错误?如果我必须让它抛出编译时错误,我需要做什么更改?

在大多数情况下,它是正确的,但您需要在实例化过程中指定该部分(否则它将默认为原始类型,类似于。有关原始类型和之间差异的详细信息,请参阅)。Foo和Bar都是对象,所以编译器看到了这一点并认为它是正确的

下面是使用的实例。这里,
InterfaceXYZ
和FooImplementation是可互换的(因为编译器知道FooImplementation是
InterfaceXYZ

给福

InterfaceXYZ<Foo> fi = new FooImplementation();
Delegator<Foo> d = new Delegator<Foo>(fi);
d.doSomething(new Foo());
InterfaceXYZ fi=new foooimplementation();
委托人d=新委托人(fi);
d、 doSomething(newfoo());
对于Bar(获取编译时错误而不是运行时错误)

InterfaceXYZ fi=new foooimplementation();
委托人d=新委托人(fi);
d、 doSomething(新条());
附加说明:


InterfaceXYZ fi=new foooimplementation()
不会抛出编译时错误,因为您可能会说将fi添加到您声明的
Delegator d=newdelegator(fi)列表中作为原始类型。Try
Delegator d=新的Delegator(fi)您正在混合泛型和原始类型。编译时错误只能在实例化时使用泛型(类型参数初始化)时抛出。永远不要使用原始类型!编译器还应生成有关原始类型用法的警告。最好不要忽略这些。@Jens,它应该会生成一个警告,但这取决于您的IDE及其配置。但是,是的,所有的警告都是不好的,除非你确切地知道它被抛出的原因,并且你有一个很好的理由忽略它。我的主要问题是——为什么?编译器难道没有足够的信息来表明这两个是不兼容的吗?等等,那么你在说什么…InterfaceXYZ=new FooImplementation();是否可行?@Akshay遗憾的是,编译器非常肤浅,而且据它所知是有效的(例如,如果您想将FooImplementation和BarImplementation添加到列表中)
FooImplementation fi = new FooImplementation();
Delegator d = new Delegator(fi);
d.doSomething(new Bar());
InterfaceXYZ<Foo> fi = new FooImplementation();
Delegator<Foo> d = new Delegator<Foo>(fi);
d.doSomething(new Foo());
InterfaceXYZ<Bar> fi = new FooImplementation();
Delegator<Bar> d = new Delegator<Bar>(fi);
d.doSomething(new Bar());