我无法理解与泛型有关的子类型/接口实现背后的概念。请解释。 我有以下结构:
`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抱怨。
如果我改变如下:
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包含Type T的对象???这是什么 ?
这背后的理由是什么?有人可以请expalin。
答案 0 :(得分:1)
这里有两个问题:
正如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>