2

ジェネリック型を使用してJavaでプログラミングを学んでおり、おそらく非常に基本的な質問を受けました。

残りの 2 つのスニペットの違いはどこですか?

1.)

public void build(House house) {
    // work only with house objects that extending House
}

2.)

public <T extends House> void build(T house) {
    // work only with house objects that extending House
}
4

3 に答える 3

5

パラメータとして取り込めるものに関して、これら 2 つのメソッドに違いはありません。ただし、後者の例では、特定の type にアクセスできますT。いずれにせよ、この例はジェネリックの能力を示していません。

LinkedList例として、Node<T>オブジェクトの を考えてみましょう。Node<T>任意のタイプのオブジェクトを保持できるラッパー を定義できます。これは、多くの異なるオブジェクトに使用できる 1 つのコードを記述できるため、非常に便利な構造です。

于 2013-11-13T13:22:02.573 に答える
1

違いは、2 番目の関数内ではT、呼び出し元がメソッドへのアクセスに使用した型 type にアクセスできることです。

Houseただし、直接使用するのとは意味が異なるその型を使用する方法は考えられません。メソッドの他のいくつかのパラメーターまたは戻り値の型との違いが生じる場合があります。

于 2013-11-13T13:26:42.157 に答える
0

それらは論理的に同じです。

ただし、2 番目のケースでは、コンパイラはいくつかの高度な検証を行うことができます。

XHouse と YHouse と呼ばれる House の 2 つのサブクラスがあるとします。

次のソースコードがあります。

XHouse house = build(yHouse)

yHouse が YHouse 型のオブジェクトであり、YHouse が XHouse のサブクラスでない場合、これは失敗します。

ジェネリックは一種のテンプレートと考えてください。ジェネリック引数を入力すると、新しいメソッドが作成されます。上記の例では、ジェネリック メソッドを使用すると、仮想的に次のものが作成されます。

public XHouse void build(XHouse house) {
    // work only with XHouse objects that extending XHouse
}

コメントも変更したことに注意してください。

于 2013-11-13T13:21:33.690 に答える