(§8.4.8.1)によると、 の署名が の署名のサブ署名 (§8.4.2) である場合、インスタンス メソッドは別のインスタンスメソッドをm1
オーバーライドしますm2
m1
m2
。
言い換えると、オーバーライド メソッド シグネチャは、オーバーライドされたメソッド シグネチャまたはオーバーライドされたメソッド シグネチャの消去(§4.6)と同じである必要があります。
そのため、オーバーライドされたメソッド パラメーターは、オーバーライド メソッド内の特定性の低い型のパラメーターに置き換えることはできません。なぜそうなのかはこちらで読めます。
あなたの場合、署名は署名とその消去署名 ( ) とObjectSet#getValue
同じではありません。についても同様です。ColumnSet#getValue
Object getValue(Column column)
ParameterSet#getValue
ベースメソッドが次のように宣言されている場合、 @samabcdeによって指摘されたように:
<V, I extends Column & Input<V>> V getValue(I column);
<V, I extends Parameter & Input<V>> V getValue(I value);
次のように実装できます。
@Override
public <V, I extends Column & Input<V>> V getValue(I value) {
return doGetValue(value);
}
@Override
public <V, I extends Parameter & Input<V>> V getValue(I value) {
return doGetValue(value);
}
private <V, I extends Input<V>> V doGetValue(I value) { ... }
そして、基本メソッドが次のように宣言されている場合:
<V, I extends Input<V> & Column> V getValue(I value);
<V, I extends Input<V> & Parameter> V getValue(I value);
次のようにのみ消去を実装できます。
@Override
public Object getValue(Input value) { ... }
これらのオプションはどちらも見栄えがよくないため、次の方法でコードを再設計することをお勧めします。
public interface Input<R, V> {
// ...
}
public interface ObjectSet<R> {
<V> V getValue(Input<R, V> input);
}
public class ObjectSetImpl<R> implements ObjectSet<R> {
@Override
public <V> V getValue(Input<R, V> input) {
// ...
}
}
特定の型パラメーターObjectSet
のみを受け入れるインスタンスを簡単に作成できるようになりました。Input
R
public interface Column<V> extends Input<Column<?>, V> {}
ObjectSet<Column<?>> columnSet = new ObjectSetImpl<>();
を書くのが嫌いな場合は、すべての作業を に委譲ObjectSet<Column<?>>
する、より適切な名前の実装を作成できます。ObjectSet<Column<?>>
ObjectSetImpl
public class ColumnSet extends DelegatingObjectSet<Column<?>> {}
ColumnSet columnSet = new ColumnSet();
どこDelegatingObjectSet
にある:
abstract class DelegatingObjectSet<R> implements ObjectSet<R> {
// you can use dependency injection here
private final ObjectSet<R> delegate = new ObjectSetImpl<>();
@Override
public <V> V getValue(Input<R, V> input) {
return delegate.getValue(input);
}
}