【发布时间】:2011-10-10 10:48:11
【问题描述】:
我有两个通用接口IComparable<T>,带有方法public boolean gt(T t)和ICombinable<T>,带有方法public T combine(T t),以及第三个接口IPreferenceValue<T>,它扩展了这两个接口,即IPreferenceValue<T> extends IComparable<T>, ICombinable<T>,这样T 类型的首选项值可以与其他T 进行比较和组合。我有两个 IPreferenceValue 的具体实现,一个是单值实现:IntegerValue implements IPreferenceValue<IntegerValue>,另一个是偏好值列表:PreferenceVector<S extends IPreferenceValue<S>> implements IPreferenceValue<PreferenceVector<S>>。
在其他地方,我有一个算法可以在 IPreferenceValues 上执行各种操作,我想通过接口以相同的方式处理单值和列表值 Preference 值,例如复合设计模式。我还希望有某种 Factory 可以根据某些参数创建 IPreferenceValues,即创建一个单值对象,或创建一个列表值对象。但是,当我创建这些 PreferenceValues 时,我并不关心 Parameter 类型,我只想创建 IPreferenceValue 类型的对象,工厂将返回具体实现 - 并且只需使用接口与对象交互。
但是,我在让它工作时遇到了一些困难。首先,如果我使用原始类型 IPreferenceValue 声明我的值,我会收到这些警告 - “IPreferenceValue is a raw type. References to generic type IPreferenceValue<T> should be parameterized”。这些警告可以避免吗?在其他地方,我将它们声明为IPreferenceValue<?>,我收到以下错误:The method gt(capture#6-of ?) in the type IComparable<capture#6-of ?> is not applicable for the arguments (IPreferenceLevel<capture#7-of ?>)。非常感谢任何建议或指示...
编辑:
这是我得到第二个错误的地方 (The method gt(capture#12-of ?) in the type IComparable<capture#12-of ?> is not applicable for the arguments (IPreferenceLevel<capture#13-of ?>))
private IPreferenceLevel<?> calculateMinValue()
{
IPreferenceLevel<?> min = null;
for (IPreferenceLevel<?> value : tupleToValueMap.values())
{
if ((min == null) || (min.gt(value).equals(Comparison.TRUE)))
{
min = value;
}
}
return min;
}
但是,即使我为此方法输入了一个类型,即,如果我重写如下 -
private <X> IPreferenceLevel<X> calculateMinValue()
{
IPreferenceLevel<X> min = null; ...
这仍然无法编译 - The method gt(X) in the type IComparable<X> is not applicable for the arguments (IPreferenceLevel<capture#10-of ?>)
【问题讨论】:
-
注意:除了像 Eclipse 这样的少数项目,ISomething 命名模式在 Java 中是不常见的。尝试使用真实的单词(或至少是复合单词)
-
你的
IntegerValue是一个具体的类吗?那么它如何扩展一个接口IPreferencevalue? -
@Bhaskar - 你说得对,我的意思是输入“实现”
-
如果您在映射中存储任意类型的值,我认为这可能是编译器中的真正错误。我已根据您的编辑更新了我的答案。