我无法理解与泛型相关的子类型/接口(interface)实现背后的概念。请解释。 我有以下结构:
`ICommand -> ProducerConsumerCommand`
IProducerConsumer -> SimpleProducerConsumer
我的理解是,任何实现 IProducerConsumer 的具体类都必须保存 T 类型的对象,T 类型是 Number 和 ICommand 接口(interface)的子类。
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
*绑定(bind)不匹配:类型 T 不能有效替代类型 IProducerConsumer<T,ICommand>*
的有界参数
所以,我的第一个问题是为什么我不能在具体类中定义与接口(interface)相同的方式。 幕后发生了什么。
如果我可以定义
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> {
扩展提示说要删除 token 。
现在我喜欢如下:
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
接口(interface),但只是另一个泛型类型参数声明,如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>