gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:42:58 26 4
gpt4 key购买 nike

我有两个通用接口(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com