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

3

如果我让你觉得这只是一个简单的Stack Overflow问题,或者听起来太简单了,我表示歉意。我一整天都被困在这个问题上,尝试了所有可用的资源(谷歌、Stack Overflow、朋友和Oracle Java书籍),但都没有任何帮助。

所以,我被要求处理以下代码部分。

import org.Plugin

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

我已经成功分解了这段代码的基本功能,关于Product类,我知道:
- T extends Data:T是T的子类的边界类型参数
- 我需要建立一个实现Product类和Customer方法的类。

到目前为止,我得出了以下结论:

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

我困惑的是Consumer方法中的(Plugin<T> plugin)部分是什么意思。这里的Plugin是指变量参数吗?如果是,我需要在TheProduct类中包含它吗?

我感觉自己可能错过了重要的东西,但不知道是什么。

感谢大家抽出时间阅读 :)


1
我建议将方法Customer改为小写:customer - Stephan Hogenboom
2
你需要添加泛型类型:class TheProduct implements Product<SomeDataSubclass> - 4castle
根据@4castle的评论 - 因为T在两个地方都被指定,如果您实现了Product<SomeDataSubclass>,那么plugin的类型必须Plugin<SomeDataSubclass> - Joe Clay
1
我可以从两个角度理解你的问题 - 你要么想要一个通用实现(比如class TheProduct<T> implements Product<T>),要么你想提供一个类型参数(比如class TheSugarProduct implements Product<SugarData>)。在继续之前,你需要决定它是哪种情况。 - Dawood ibn Kareem
2个回答

4
Plugin<T>Product<T> 都是泛型类型的示例。你在两个地方都使用了 T 参数,这意味着你希望它们都接收相同的泛型类型。
例如,如果你将 T 的类型指定为 string(虽然这不符合你的数据限制),那么你的客户方法将期望接收 Plugin<string> 实例。
在你的情况下,你还对 T 有一个约束,即它必须是实现 Data 接口的某种类型,但是相同的逻辑仍然适用:T 是你的泛型类型的占位符。 T 这个名称是任意选择的。对于只期望单个泛型参数的类型,约定是称之为 T,但如果有助于理解,你可以使用更多描述性的名称。

1

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

或者 Data 本身。

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

它期望一个泛化的 Plugin<T>,而不是一个 未经处理的 PluginPlugin<T> 的一个例子可以是 Plugin<Data>Plugin<SubData>,其中 SubDataData 的子类。

Plugin 是否指像变量这样的参数?

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

那么,我需要在 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 等等。你明白了吧。"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接