- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个通用接口(interface),IComparable<T>
,方法 public boolean gt(T t)
和ICombinable<T>
,方法 public T combine(T t)
,以及第三个接口(interface)IPreferenceValue<T>
它扩展了这两个接口(interface),即 IPreferenceValue<T> extends IComparable<T>, ICombinable<T>
,这样偏好值的类型为 T
可以与其他T
进行比较和组合的。我有两个 IPreferenceValue 的具体实现,其中一个是单值实现:IntegerValue implements IPreferenceValue<IntegerValue>
另一个是偏好值列表:PreferenceVector<S extends IPreferenceValue<S>> implements IPreferenceValue<PreferenceVector<S>>
.
在其他地方,我有一个算法可以对 IPreferenceValues 执行各种操作,并且我想通过接口(interface)以相同的方式处理单值和列表值首选项值,例如复合设计模式。我还希望有某种工厂可以根据某些参数创建 IPreferenceValues,即创建单值对象或创建列表值对象。但是,当我创建这些 PreferenceValues 时,我不关心 Parameter 类型,我只想创建 IPreferenceValue 类型的对象,工厂将返回具体实现 - 并且仅使用接口(interface)与对象交互。
但是我在让它发挥作用时遇到了一些困难。首先,如果我使用原始类型 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 ?>)
最佳答案
您没有提供有关具体错误情况的足够背景信息,使我无法明确指出问题所在。所以我必须给出更一般的指示。
首先,原始类型警告是正确的。原始类型可以说只是为了向后兼容而存在,并且您永远不应该在新代码中使用它们。安IPreferenceValue
总是有一个通用类型 - 如果您不知道它是什么并且不关心,请将其作为 IPreferenceValue<?>
返回就像你已经做的那样。这很好,并且本质上传达了您不知道/不关心该参数的信息。 (当然,如果您知道它可能是什么,那么请务必提供更具体的参数。)
第二个错误似乎是合法的 - 您需要传入 T
但你试图传递 IPreferenceValue<T>
.
而且,一旦你解决了这个问题,你仍然会遇到问题。底层错误以完全不同的方式发生,并且对于泛型来说并不少见。您已获得对 IPreferenceValue<?>
的引用你试图调用它 gt
方法,它被定义为采用 T
。但你刚才说你完全不知道什么T
用于该对象(这就是您使用通配符的原因) - 如果您不知道通用参数是什么,您如何将任何内容传递给它并知道它的类型正确?
具体来说,您正在尝试比较 tupleToValueMap
的内容与彼此。为了合法地做到这一点,它们的泛型类型参数必须相同 - 您如何比较 IPreferenceLevel<IntegerValue>
与 IPreferenceLevel<PreferenceVector<S>>
?
所以你应该声明 tupleToValueMap
的类型更具体地说,为偏好级别提供具体的通用参数,而不是 ?
。如果事实证明您无法执行此操作,因为您在其中放置了多种类型的偏好级别 - 那么编译器错误是正确的,您无法安全地将它们相互比较。
关于带有泛型的java复合设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7711687/
我是一名优秀的程序员,十分优秀!