接口和实现类基本原理中的泛型参数化定义

时间:2014-04-02 06:29:04

标签: java generics subtyping

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

`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。

1 个答案:

答案 0 :(得分:1)

这里有两个问题:

  1. 正如IProducerConsumer<T extends Number,ICommand>中声明的那样,ICommand未引用您的ICommand接口,而是另一种类似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>