我很抱歉,如果有人简单地转向堆栈溢出或者听起来太容易,这种情况就消失了。我整天都在解决这个问题,而我尝试过的所有资源(谷歌,堆栈溢出,朋友和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类中?
我觉得我缺少主要的东西,但是不知道是什么。
谢谢所有花时间阅读的人:)
答案 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 Plugin
。 Plugin<T>
的示例是Plugin<Data>
或Plugin<SubData>
,其中SubData
是Data
的子类。
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
是方法的一个非常奇怪的名称,因为它是一个名词并且大写。我们将编写registerCustomer
,serveCustomer
,sellPluginToCustomer
。你明白了。