Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有泛型的java复合设计模式_Java_Generics - Fatal编程技术网

带有泛型的java复合设计模式

带有泛型的java复合设计模式,java,generics,Java,Generics,我有两个通用接口,IComparable,方法是public boolean gt(T)和ICombinable,方法是public T combine(T),第三个接口是IPreferenceValue,它扩展了这两个接口,即IPreferenceValue扩展了IComparable,i可组合,以便可以将类型为T的首选项值与其他T进行比较和组合。我有两个具体的IPreferenceValue实现,一个是单值实现:IntegerValue实现IPreferenceValue,另一个是首选项值列

我有两个通用接口,
IComparable
,方法是
public boolean gt(T)
ICombinable
,方法是
public T combine(T)
,第三个接口是
IPreferenceValue
,它扩展了这两个接口,即
IPreferenceValue扩展了IComparable,i可组合
,以便可以将类型为
T
的首选项值与其他
T
进行比较和组合。我有两个具体的IPreferenceValue实现,一个是单值实现:
IntegerValue实现IPreferenceValue
,另一个是首选项值列表:
PreferenceVector实现IPreferenceValue

在其他地方,我有一个算法,可以对IPReferenceValue执行各种操作,我希望通过接口以相同的方式处理单值和列表值的首选项值,就像复合设计模式一样。我还希望有某种类型的工厂,可以基于某个参数创建IPreferenceValues,即创建一个单值对象,或创建一个列表值对象。但是,当我创建这些PreferenceValue时,我不关心类型参数,我只想创建IPreferenceValue类型的对象,工厂将返回具体的实现,并且只使用接口与对象交互

然而,我有一些困难,让这个工作。首先,如果我使用原始类型IPreferenceValue声明我的值,我将收到以下警告-“
IPreferenceValue是原始类型。对泛型类型IPreferenceValue的引用应参数化”
”。这些警告可以避免吗?在其他地方,当我将它们声明为
IPreferenceValue
时,我得到以下错误:
类型IComparable中的方法gt(capture#6-of?)不适用于参数(ipreferencevel)
。非常感谢您的任何建议或建议

编辑: 这里是我得到第二个错误的地方(
类型IComparable中的方法gt(capture#12 of?)不适用于参数(IPreferenceLevel)

private IPreferenceLevel calculateMinValue()
{
IPreferenceLevel min=null;
对于(IPreferenceLevel值:tupleToValueMap.values())
{
if((min==null)| |(min.gt(value).equals(Comparison.TRUE)))
{
最小值=数值;
}
}
返回最小值;
}
然而,即使我为这个方法输入了一个类型,也就是说,如果我重写如下-

private <X> IPreferenceLevel<X> calculateMinValue()
{
    IPreferenceLevel<X> min = null; ...
private IPreferenceLevel calculateMinValue()
{
IPreferenceLevel min=null。。。

这仍然无法编译-
类型IComparable中的方法gt(X)不适用于参数(IPreferenceLevel)

您没有为我提供足够的关于特定错误情况的上下文,以便我能够明确指出问题所在。因此,我必须给出更一般的指针

首先,原始类型警告是正确的。可以说,原始类型的存在只是为了向后兼容,您不应该在新代码中使用它们。
IPreferenceValue
总是有一个泛型类型-如果您不知道它是什么,也不关心它,请按您已经做过的那样将它作为
IPreferenceValue
返回。这很好,而且是正确的整体传达您不知道/不关心该参数(当然,如果您知道它可能是什么,那么一定要提供一个更具体的参数)

第二个错误似乎是合法的-您需要传入一个
T
,但您正试图传入一个
IPreferenceValue

但是,一旦你解决了这个问题,你仍然会有一个问题。潜在的错误以一种完全不同的方式发生,对于泛型来说也不太常见。你有一个对
IPreferenceValue
的引用,并且你试图调用它的
gt
方法,该方法被定义为取
T
。但是你刚才说你有绝对不知道该对象的
T
是什么(这就是使用通配符的原因)-如果您不知道泛型参数是什么,如何向它传递任何信息并知道它的类型正确

具体地说,您正试图将
tupleToValueMap
的内容相互比较。为了合法地进行比较,它们的泛型类型参数必须相同-如何将
IPreferenceLevel
IPreferenceLevel
进行比较


因此,您应该更具体地声明
tupleToValueMap
的类型,为其提供一个具体的通用参数来表示首选项级别,而不是
安全地互相对抗。

注意:除了像Eclipse这样的少数项目外,ISomething命名模式在Java中是不常见的。请尝试使用真实单词(或至少是复合单词)你的
IntegerValue
是一个具体的类吗?那么它如何扩展接口
IPreferencevalue
?@Bhaskar-你是对的,我的意思是键入“implements”,如果你在映射中存储任意类型的值,我想这可能是编译器中的一个真正错误。我更新了我的答案以响应你的编辑。
private <X> IPreferenceLevel<X> calculateMinValue()
{
    IPreferenceLevel<X> min = null; ...