Java(バージョン8)には2つのインターフェースがあり、非常によく似ています。インターフェイスを変更したり、それらを実装するクラスを変更したりすることはできません。
public interface A {
int get();
}
public interface B {
int get();
int somethingelse();
}
今、私はその実装が両方のインターフェースに(ほぼ)フィットする関数を持っています。私はそれがそのようなことをしたいと思っています:
public int foo((A | B) p) {
int ret = 0;
if (p instanceof B) {
ret = p.somthingelse();
}
return ret + p.get();
}
この関数はプログラムのメインパイプラインにあるため、インスペクションを使用したくありません。良い性能が欲しいです。Javaでこれを行うことは可能ですか?
編集:
簡単な解決策は、コピー/貼り付けしてfoo()
、インターフェイスごとに異なる方法で実装することです。しかし、実際foo()
には、インターフェースはそれよりもはるかに長く、コードの重複を避けようとしています。
2
AとBには共通点はありません。したがって、2つのfoo()メソッドを作成します。1つはBを受け取り、もう1つはAを受け取ります。また、パフォーマンスの問題が発生するまで、パフォーマンスの問題の原因を推測せず、測定によってこの仮定を確認します。 。
—
JB
@JBNizet AとBは
—
Liran Funaro
get()
共通しています。これはもちろん単純化された例です。実際には、それらはより多くの機能を共有しています。
いいえ、ありません。BはAを拡張しません。そのため、同じシグネチャと戻り値の型を持つメソッドがあるだけです。すべてのBがAであると仮定されている場合、BはAを拡張する必要
—
JB Nizet
@ user2478398 ernest_kの回答を見ましたか?それはあなたが話していることだと思います。
—
Liran Funaro
@LiranFunaroそれら(両方のインターフェース)に共通点がある場合は、それを親に抽出してさらに拡張してみませんか?余談ですが、
—
ナマン
public
アクセサはインターフェイスメソッドに対して冗長です。そして、instanceof
代わりにimplements
?