如何在Java中正确实现通用接口

时间:2019-05-07 20:02:00

标签: java oop generics

我很抱歉,如果有人简单地转向堆栈溢出或者听起来太容易,这种情况就消失了。我整天都在解决这个问题,而我尝试过的所有资源(谷歌,堆栈溢出,朋友和Oracle Java书籍都没有被证明有用。

所以我得到了下面必须处理的代码部分。

import org.Plugin

public interface Product<T extends Data>{
   void Customer(Plugin<T> plugin);
}

关于Product类,我设法分解了此代码的工作基础,我知道:
-T扩展数据:T的有界类型参数,T必须是Data的子类
-我需要构建一个类来实现与Customer方法一起使用的Product类。

到目前为止,我想到了这个:

class TheProduct implements Product{
   @Override
   public void Customer(Plugin plugin){
   }
}

我很困惑的是,Consumer方法的(Plugin<T> plugin)部分所做的事情。插件是否引用诸如变量之类的参数?如果是这样,我是否需要将其包含在TheProduct类中?

我觉得我缺少主要的东西,但是不知道是什么。

谢谢所有花时间阅读的人:)

2 个答案:

答案 0 :(得分:4)

Plugin<T>Product<T>都是通用类型的示例。您在两个地方都使用过T参数的事实意味着您希望这两个地方都收到相同的泛型类型。

例如,如果您将string指定为T的类型(尽管这不符合您的数据约束),则您的customer方法将期望接收Plugin<string>的实例

在您的情况下,您对T也有一个约束,它必须是实现Data的某种类型,但适用相同的逻辑:T是您的泛型类型的占位符。

名称T是任意的。对于需要单个通用参数的类型,约定是将其称为T,但如果有帮助,则可以使用更具描述性的内容。

答案 1 :(得分:1)

  

T的有界类型参数,T必须是Data的子类

Data本身。

  

(Plugin<T> plugin)方法的Consumer部分做什么?

它期望generalised Plugin<T>,而不是raw PluginPlugin<T>的示例是Plugin<Data>Plugin<SubData>,其中SubDataData的子类。

  

Plugin是否引用诸如变量之类的参数?

Plugin无法引用。您可以。在Customer的定义中,您引用的是T中定义的类型参数Product<T extends Data>

  

如果是这样,我是否需要将其包含在TheProduct类中?

是的,你知道。您已经获得了一个类型参数T,该参数概括了接口Product。现在,您正在从抽象过渡到实现。 T是抽象的东西。您需要一个真实的东西,一个扩展Data的真实的类。

class Data {}
class SubData extends Data {}

interface Product<T extends Data>{
  void Customer(Plugin<T> plugin);
}

class TheProduct implements Product<SubData>{
  @Override
  public void Customer(Plugin<SubData> plugin){
  }
}

Customer是方法的一个非常奇怪的名称,因为它是一个名词并且大写。我们将编写registerCustomerserveCustomersellPluginToCustomer。你明白了。