1

我无法理解与泛型相关的子类型/接口实现背后的概念。请解释。我有以下结构:

`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 类型的对象???这是什么 ?

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

4

1 回答 1

1

你在这里有两个问题:

  1. 正如现在在 中声明的那样IProducerConsumer<T extends Number,ICommand>ICommand它没有引用您的ICommand接口,而只是另一个泛型类型参数声明,例如T. 因此,您会收到警告,即此泛型类型参数正在隐藏您的ICommand界面。你必须IProducerConsumer这样声明你的喜欢:

    public interface IProducerConsumer<N extends Number, C extends ICommand>
    
  2. 你得到一个Bound mismatchfor T,因为T不一定Number按照IProducerConsumer接口的要求扩展。要解决此问题,您必须SimpleProducerConsumer这样声明:

    public class SimpleProducerConsumer<N extends Number, C extends ICommand> implements Runnable, IProducerConsumer<N,C>
    
于 2014-04-02T06:55:18.753 回答