我无法理解与泛型相关的子类型/接口实现的概念。请解释。
我具有以下结构:
`ICommand -> ProducerConsumerCommand`
IProducerConsumer -> SimpleProducerConsumer
我的理解是,任何实现IProducerConsumer的具体类都必须包含T类型的对象,该对象是Number和ICommand接口的子类。
IProducerConsumer<T extends Number,ICommand>
现在,我想编写一个实现类SimpleProducerConsumer,
现在,我的目的是告诉我,SimpleProducerConsumer可以保存IProducerConsumer类型参数中定义的任何类型参数,如下所示:
public class SimpleProducerConsumer<T,ICommand> implements Runnable,
IProducerConsumer<T,ICommand> {
它没有用,它说如下:
SimpleProducerConsumer<T,ICommand> - ICommand complains (warning) that it is getting hidden.
IProducerConsumer<T,ICommand> - compiler errors in T saying as below
*边界不匹配:类型T不是类型
IProducerConsumer<T,ICommand>*
的边界参数的有效替代所以,我的第一个问题是为什么我不能在具体的类中定义与接口相同的方式。
内幕发生了什么。
如果我可以定义
public class test<ICommand> {}
为什么在实施时却不能做同样的事情,令人困惑。
现在我定义如下
public class SimpleProducerConsumer<T,ProducerConsumerCommand> implements Runnable,
IProducerConsumer<T,ICommand> {
IProducerConsumer中的T仍在抱怨。
如果我更改如下:
public class SimpleProducerConsumer<T,ProducerConsumerCommand> implements Runnable,
IProducerConsumer<T extends Number,ICommand> {
扩展抱怨说要删除令牌。
现在我这样做如下:
public class SimpleProducerConsumer<T extends Number,ProducerConsumerCommand> implements Runnable,
IProducerConsumer<T extends Number,ICommand> {
仍在IProducerConsumer中扩展不起作用。
现在
public class SimpleProducerConsumer<T extends Number,ProducerConsumerCommand> implements Runnable,
IProducerConsumer<T,ICommand> {
是的,现在编译器很高兴。现在我完全迷失了,上面的意思是什么。 SimpleProducerConsumer包含类型T的对象,这些对象是Number的子类,并且ProducerCommand对象是有意义的,但是IProducerConsumer保留类型T的对象?这是什么 ?
这背后的理由是什么。有人可以解释一下。
最佳答案
您在这里有两个问题:
正如现在在IProducerConsumer<T extends Number,ICommand>
中声明的那样,ICommand
不是引用您的ICommand
接口,而只是引用另一个通用类型参数声明,例如T
。因此,您得到警告,该通用类型参数正在隐藏您的ICommand
接口。您必须这样声明您的IProducerConsumer
:
public interface IProducerConsumer<N extends Number, C extends ICommand>
您得到
Bound mismatch
的T
,因为T
不一定按照Number
接口的要求扩展IProducerConsumer
。要解决此问题,必须像下面这样声明您的SimpleProducerConsumer
:public class SimpleProducerConsumer<N extends Number, C extends ICommand> implements Runnable, IProducerConsumer<N,C>