0

今日、私は Java ポリモーフィズムに夢中になりました。ありえないと思っていたことをやってしまった。つまり、拡張インターフェースがあります。

空のインターフェースを作成しました:

public interface Figure {}

今のところ新しいものはありません。次に、インターフェイスを拡張するパラメーターを使用して、パラメーター化されたクラス Board を作成しました。

public class Board< T extends Figure > { 
    T[][] board;
}

ありえないと思いました!それにもかかわらず、私は理解できないままさらに進んでいました。

Figure インターフェイスを実装するクラスを作成しました。

public class Cross implements Figure{}

そして驚いたことに、私はそれを行うことができました:

Board b = new Board<Cross>();

私を助けて、この奇妙な状況を説明してください。
私はポリモーフィズムについて少し知っており、Cross が Figure であることを理解しています。どのようなタイプでもインターフェースを拡張できるのか、インターフェースを拡張しない (インターフェースを拡張しない) インターフェースを実装するクラスは、インターフェースを拡張するパラメーターとしてどのように正しいのか、私は混乱しています。

このポリモーフィックな混乱を説明してください。ありがとう。

4

3 に答える 3

1

あなたが言うときpublic class Board< T extends Figure >、それは、ボードがこれらのインターフェースを実装するクラスのいずれかFigureまたはサブインターフェースを受け入れることができることを意味します。Figureだから、あなたが言うとき:

public class Cross implements Figure{}

Board b = new Board<Cross>();

これは、 IS-A以来、 Cross が を実装しているためFigure、 をBoard受け入れることができることを意味します。CrossCrossFigure

インターフェースの拡張に関する限り、インターフェースのみがインターフェースを拡張できます。したがって、以下は合法です。

public interface TwoDimensionalFigure extends Figure{}.

したがって、 を実装する任意のクラスTwoDimensionalFigureも で受け入れることができますBoard

于 2013-04-29T07:13:55.170 に答える
1

することで

public class Board< T extends Figure > { 
    T[][] board;
}

タイプのスーパークラスT持つ必要がある境界付きジェネリックタイプを作成しています Figure

このスレッドで説明されているように、インターフェイスまたはクラスを拡張するジェネリック型の定義に違いはありません。

コンパイラが確認するのは、 を作成するときBoardTextends Figureまたはimplements Figure

于 2013-04-29T07:14:22.730 に答える
0

実際には、インターフェースを拡張していません。Cross 型のジェネリック クラスを作成するだけです。クラスの定義は、パラメータ化された型が Figure から派生する必要があることを指定するだけです。つまり、Figure またはその派生物を実装します。

于 2013-04-29T07:15:38.923 に答える