0

私はこれを知っているべきだと思いますが、尋ねられたときにそれを説明することはできません. 私は方法を持っています:

public <T extends IByteConverter<T>> int write(T obj) throws IOException {
    byte[] byteArray = obj.toByteArray();
    raFile.write(byteArray);
    //keeps track of size of what was written
    return byteArray.length;
}

そして私のインターフェース:

interface IByteConverter<T> {
    public byte[] toByteArray();
    public T fromByteArray(byte[] byteArray);
}

obj.toByteArray() を呼び出すと、プログラムは何をすべきかをどのように認識しますか? クラスのどこに IByteConverter のコードを実際に実装するかはわかりませんが、プログラムは期待どおりに動作します。何が起こっているのかを説明する簡単な方法はありますか?

4

2 に答える 2

3

別の例で物事を理解しやすくしましょう: メソッドを持つインターフェース Fruit を定義しますgetColor()。このメソッドの規約は、色を返すことです。

このコントラクトに基づいて、 の配列を受け取り、Fruit赤いものの数をカウントするクラスを定義します。

このメソッドをコンパイルするために実装する必要はありません。これは、このメソッドに渡すことができる唯一のものはオブジェクトの配列であり、それは実際にFruitインターフェイスを実装するクラスのインスタンスであるからです。このメソッドを実行するFruitには、インターフェースを実装するクラスを少なくとも 1 つ定義し(Appleたとえば)、このクラスのオブジェクトの配列を構築する必要があります。

それがポリモーフィズムのすべてです。インターフェイスのコントラクトを尊重していれば、実際のクラスが何であるかを知らなくても、オブジェクトのメソッドを呼び出すことができます。

ジェネリックはこれを変えません。objタイプTは であり、Textendsであるため、 on でメソッドをIByteConverter呼び出すことができます。toByteArray()obj

于 2012-11-30T20:42:38.400 に答える
0

このタイプのメソッド<T extends IByteConverter<T>>は、 object の内部メソッドについて知る可能性を提供しますT。この宣言は、少なくともすべてのメソッドがこのメソッド内でアクセスできるように、extends型のパラメーターを配置することを呼び出し元に義務付けます。IByteConverterIByteConverter

于 2012-11-30T20:36:11.637 に答える