我无法理解与泛型相关的子类型/接口(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 的对象???这是什么 ?

这背后的理由是什么?有人可以解释一下吗?

请您参考如下方法:

这里有两个问题:

  1. 正如 IProducerConsumer<T extends Number,ICommand> 中现在所声明的那样, ICommand没有引用您的 ICommand接口(interface),但只是另一个泛型类型参数声明,如 T 。因此,您会收到警告,该泛型类型参数隐藏了您的 ICommand界面。您必须声明您的IProducerConsumer像这样:

    public interface IProducerConsumer<N extends Number, C extends ICommand> 
    
  2. 您会得到 Bound mismatch对于 T ,因为T不一定延伸Number ,按照 IProducerConsumer 的要求界面。要解决此问题,您必须声明您的 SimpleProducerConsumer像这样:

    public class SimpleProducerConsumer<N extends Number, C extends ICommand> implements Runnable, IProducerConsumer<N,C> 
    


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!