【发布时间】:2020-04-18 07:05:28
【问题描述】:
我有两个不同的界面
interface ColumnSet {
<V, I extends Column & Input<V>> V getValue(I column);
}
interface ParameterSet {
<V, I extends Parameter & Input<V>> V getValue(I value);
}
Column 和 Parameter 类型只是简单的标记接口,用于阻止 Columns 在应使用 Parameters 的地方使用,反之亦然。因此,在幕后,我希望有一个单独的类来实现它们,如下所示:
class ObjectSet implements ColumnSet, ParameterSet {
@Override public <V, I extends Input<V>> V getValue(I input) {
...
}
}
从逻辑上讲,ObjectSet.getValue 似乎应该是ColumnSet.getValue 和ParameterSet.getValue 的有效覆盖,因为它将任何Input<V> 作为参数,其上限为Column & Input<V> 和Parameter & Input<V>。然而,Java 9 并不认为它会覆盖其中任何一个报告 The method getValue() of type ObjectSet must override or implement a generic supertype method。
这是 Java 中泛型的限制还是我遗漏了一些基本的东西?
(显然我无法在 ObjectSet 中创建两个单独的方法,因为它们具有相同的擦除,这让我可以选择为我正在尝试的接口中的两个 getValue 方法提供不同的名称避免)。
【问题讨论】:
-
我通过在
ObjectSet中添加方法<V, I extends Column & Input<V>> V getValue(I column);和<V, I extends Column & Input<V>> V getValue(I column);来编译没有错误。 -
啊,所以在我原来的例子中,我交换了
Column/Parameter和Input。如果你在任何地方都写了Column & Input<V>和Parameter & Input<V>,那么你可以添加这两种方法。如果你改为在任何地方写Input<V> & Column和 `Input& Parameter`,则不允许添加这两种方法,因为类型擦除只使用第一个绑定而不是第二个绑定。这给了我一个继续的方法,谢谢!我仍然对为什么原来的方法不起作用感兴趣。 -
我刚刚意识到如何避免您的问题并将
ObjectSet与ColumnSet、ParameterSet以及所有其他可以创建的设置集解耦。看看我的答案,我已经更新了。
标签: java generics overriding upperbound