20

次のクラス構造があるとします。

class Base {}
class A extends Base {}
class B extends Base {}
class C extends Base {}

ABのインスタンスを受け入れるが、Cのインスタンスは受け入れないメソッドを書きたいと思います。
Javaでそれを達成できますか?

私はこれが良い継承状況ではないことを知っています ( ABはCとは異なる共通の親を持つ必要があります) が、私はこのような状況を処理する Java の方法にのみ興味があります。

編集:
!!!
より良い継承が問題を解決することを私は知っています。Javaにそのような問題を解決するための標準的なメカニズムがあるかどうか、私はただ興味があります。
!!!

4

9 に答える 9

43

インターフェイスを使用し、それAB実装するだけです。

于 2012-12-21T12:47:22.310 に答える
13

インターフェイスは使えますか?例えば

class Base {}
interface MyGenericInterface {}
class A extends Base implements MyGenericInterface {}
class B extends Base implements MyGenericInterface {}
class C extends Base {}

そうすれば、メソッドは MyGenericInterface の実装を受け入れることができます。A と B はインターフェイスを実装しますが、C は実装しないため、必要に応じて A と B のインスタンスを受け入れますが、C のインスタンスは受け入れません。

于 2012-12-21T12:48:47.883 に答える
8

そのようなメソッドが欲しいという理由だけで型階層を変更するべきではありません。しかし、そのようなメソッドが必要な場合は、型階層について考える必要があることを示している可能性があります。

しかし、型が適切に設計されていると確信している場合は、次のアプローチはどうでしょうか。

    public class T {

        public void doSomething(final A a) {
            doSomthing(a);
        }

        public void doSomething(final B b) {
            doSomthing(b);
        }

        private void doSomthing(final Base b) {

            // Here is the implementation

        }

    }
于 2012-12-21T13:11:13.483 に答える
8

何かが を受け入れるべきAであるBが、そうでない場合は、そもそもCなぜCがから継承されているのかを再考する必要がありますBase。継承のレイヤーを追加できます。

   ---Base---
   |        |
--Sub--     C
|     |
A     B

次に、メソッドが type のオブジェクトのみを受け入れるようにすることができますSubSub何もする必要さえありませんし、技術的にはすべてBase.

ただし、より迅速な解決策は汚いでしょうif( arg.instanceof(C) )...

于 2012-12-21T12:49:07.557 に答える
8

実行時に例外を使用して処理できます。

void genericMethod(Base arg_in)
{
    if(arg_in instanceof C)
    {
        throw IllegalArgumentException("C class not accepted."); 
    }

    ...
    ...
}
于 2012-12-21T12:49:16.653 に答える
3

あなたの質問への答えは、「いいえ、Javaにはそのような問題を処理する標準的な方法がありません」だと思います。この問題がある場合は、継承を修正したり、MrSmith42 によって提供された巧妙な手法を使用したりするなど、他の回答をここで見ることができます。

于 2012-12-21T13:16:54.993 に答える
2

ジェネリックスは型安全性のためのものです。限目。任意のものを「許可」または「禁止」しないでください。CではなくAとBを許可する型安全性の理由はありません。

于 2012-12-21T19:48:00.377 に答える
2

instanceofオブジェクトが特定のタイプであるかどうかを確認するために使用できます。

もちろん、より良いアイデアはより良い継承構造になるでしょう。

于 2012-12-21T12:47:02.747 に答える