1

このようなことは、Java ではまったく意味がありますか?

class A<T extends B> extends T{ 
  int fun1() {
    ....
  }      
}

abstract class B extends X implements C {

}

interface C {
  int fun1();
}

クラスBがXとCの両方を理想的に拡張することを望みます。しかし、Java には多重継承がないため、よりスマートな回避策を見つけようとしています。

秘訣は、C で定義されるものを代わりにスーパー クラス "A" で定義することです。問題は、「拡張」後にジェネリック型を使用できるようにすることです

考え?

4

4 に答える 4

4

いいえ、型パラメーターとして指定されたクラスを拡張する型を作成することはできません

A、B、C、または X が何であるかを知らなければ、別の設計パターンを推奨することは非常に困難です。

于 2009-08-11T06:55:47.833 に答える
2

あなたがやろうとしていることはうまくいきません.Javaジェネリックは継承とは何の関係もありません. 多重継承はありません。それで和解する必要があります:-)

複数のインターフェイスを宣言し、集約を使用して多重継承を「偽装」することができます。

于 2009-08-11T06:57:21.793 に答える
1

他の人が言っているように、ジェネリックスは実装の多重継承には役立ちません。

多重継承のために自分自身を繰り返さないための私の回避策は、通常、スーパークラスの静的メソッドで共通の実装を記述し、それが必要な場所からそれに委任することです。

最も簡単な例は次のようになります。

class A
{
}

class B extends A 
{
}

interface C
{
    void foo();
}

class CBase extends A implements C
{
    public void foo()
    {
        sFoo(this);
    }

    static void sFoo(C c)
    {
        // Implement foo here
    }
}

class D extends B implements C
{
    public void foo()
    {
        CBase.sFoo(this);
    }
}

これを便利にするために、DがBおよびAから継承する操作が増えることに注意してください。これらは、この例には示されていません。

于 2009-08-11T08:37:47.457 に答える
0

型パラメーターは、コンパイル時のみのジェネリックの単なるプレースホルダーであり、実際の型です。

多重継承をサポートしていない言語で回避策を見つけようとすることは、おそらく設計に問題があることを示す良い指標です。言うことA<T extends B> extends T、あなたが望んでいることを意味するものでさえないので、明らかに失敗します-<T extends B>つまりT、. はそのクラスで定義されていないため、追加しても意味がありません。繰り返しますが、これはコンパイル時の型です。実行時に T の実際の型を直接利用することはできません。 Bextends TT

構成ではなく、多重継承によって何が最も適切に達成されるのか本当に確信がありますか? Aあまりにも多くのことをしようとしている可能性もあります。

より具体的な例は、他の人が設計自体についてより多くのフィードバックを与えることを可能にするかもしれません.

于 2009-08-11T08:04:36.507 に答える