0

私は現在、次のページで Java の Generics の例に従っています: http://docs.oracle.com/javase/tutorial/java/generics/types.html

public interface Pair<K, V> {
    public K getKey();
    public V getValue();
}

public class OrderedPair<K, V> implements Pair<K, V> {

    private K key;
    private V value;

    public OrderedPair(K key, V value) {
    this.key = key;
    this.value = value;
    }

    public K getKey()   { return key; }
    public V getValue() { return value; }
}


Pair<String, Integer> p1 = new OrderedPair<String, Integer>("Even", 8);
OrderedPair<String, Integer> p1 = new OrderedPair<>("Even", 8);

私の質問は、変数を作成する最後の行についてです。一番最初に、1 つはペア インターフェイスから始まり、もう 1 つは OrderedPair クラスから始まります。どちらを使うかで違いはありますか?コードが異なる理由を理解しようとしています。

4

3 に答える 3

2

コードが無効です。Java では、同じスコープで同じ名前の 2 つの変数を使用することはできません。

名前がp1との場合p2、それぞれが class の異なるオブジェクトを参照しますOrderedPair<String,Integer>。2 番目のケースでは、変数の型 (変数名の前)newで既に指定されているため、ジェネリック引数を から省略することができました。OrderedPair<String, Integer>最初のケースでは、オブジェクトの型は変数の型のサブクラスです。これはポリモーフィズムごとに有効です。ジェネリック引数が 2 回指定されました。これも冗長ではありますが有効です。

上で述べたように、 と の両方が type のオブジェクトを参照しp1ます。ただし、静的(宣言された) 型が異なります。この場合、これは次のことを意味します。p2OrderedPair<String,Integer>p1p2

  1. typeに から継承されていないOrderedPairメソッドreverseOrder(何かを言うため)がある場合、有効ではありません (参照されるオブジェクトが正しい型であっても、コンパイラはこれを知りません) 。ここでは、 (より具体的にする必要があり、それを持っているため)よりも「優れています」 。Pairp1.reverseOrder()p2.reverseOrder()p2p1p2
  2. 3 番目のタイプを定義したUnorderedPait implements Pair場合、このタイプの新しいインスタンスは に割り当てられますがp1、 には割り当てられませんp2。ここでは、 (より一般性が必要であり、それを持っているため)p1よりも「優れています」 。p2p1
于 2013-09-01T00:03:24.257 に答える
0

最初のものは Pair の参照を使用します。これにより、Pair インターフェイスの任意の実装 (OrderedPair、SortedPair、LongPair など) を指すことができます。

しかし、2 番目の参照では、OrderedPair のオブジェクトのみを指すことができます。

于 2013-09-01T00:02:32.773 に答える
0

OrderedPairインターフェイスにリストされていないクラスにメソッドがあった場合、それらを呼び出すにPairは型の式が必要になります。OrderedPairつまり、変数を として宣言してからOrderedPair、その変数のメソッドを呼び出します。一方、Pairインターフェイスにリストされているメソッドのみを使用している場合は、変数を として宣言し、Pairそのメソッドを呼び出すことができます。後者を実行する理由は 2 つあります。

  • 型の変数はPair、実装する他のクラスのオブジェクトを参照できます。のサブクラスではない などを実装しPairている可能性がありUnorderedPairます。PrettyPairOrderedPair
  • Pairこれは、プログラムの将来の管理者に、その変数のメソッドのみを使用していること、つまり固有のメソッドはOrderedPair使用されないことを伝えます。
于 2013-09-01T00:22:02.257 に答える