4

次の Employee クラスと Manager というサブクラスを考えてみましょう。

public class Employee
{
    private String name;

    public Employee(String name)
    {
        this.name = name;
    }

    public String getInfo()
    {
        return name;
    }
}

public class Manager extends Employee
{
    public Manager(String name)
    {
        super(name);
    }
}

別のクラスでは、次のように 2 つの関数を定義しました。

import java.util.ArrayList;

public class WildCardsAndTypeVariables
{
    public static <T extends Employee> void displayInfo(ArrayList<T> employees)
    {
        for (int i=0; i<employees.size(); i++)
        {
                Employee employee = (Employee) employees.get(i);
                System.out.println(employee.getInfo());
        }
    }

    public static void displayInfo2(ArrayList<? extends Employee> employees)
    {
        for (int i=0; i<employees.size(); i++)
        {
                Employee employee = (Employee) employees.get(i);
                System.out.println(employee.getInfo());
        }
    }

    public static void main(String[] args)
    {
    Employee e1 = new Employee("John");
    Employee e2 = new Employee("Joe");
    Employee e3 = new Manager("Joseph");

    ArrayList<Employee> employees = new ArrayList<Employee>();
    employees.add(e1);
    employees.add(e2);
    employees.add(e3);

    displayInfo(employees);
    displayInfo2(employees);
   }
}

displayInfo() と displayInfo2() から同じ出力が得られます。

では、この例を考えると、ワイルドカードと型変数の違いは何でしょう?

4

3 に答える 3

3

メソッドが 1 つのパラメーターのみを取り、void戻り値の型を持つこのようなケースでは、ワイルドカード型のバージョンとジェネリック メソッドのバージョンの間でセマンティクスに何のメリットも実際の違いもありません。ジェネリック メソッドの真の力は、メソッド シグネチャ (パラメーターの型または戻り値の型) で型変数を複数回使用するときに発揮されます。簡単な例を次に示します。

public static <T extends Employee> T firstEmployee(ArrayList<T> employees) {
  return employees.get(0);
}

これは、「このメソッドは、メンバーがすべてEmployee(またはEmployeeそれ自体)のサブクラスのインスタンスであるArrayListを取り、それが返す値は同じクラスのインスタンスである」と述べています。これは、ワイルドカードだけでは表現できないものです。

于 2012-08-29T21:57:55.633 に答える
1

タイプ (例: T) を使用すると、その特定のタイプの Concrete オブジェクトのみを送信できます。

ただし、ワイルド カードを使用すると、オブジェクトの境界が定義されます。したがって、タイプ T のオブジェクト (または) タイプ T の任意のオブジェクトを渡すことができます。

あなたの場合、従業員だけなので、大きな違いはありません。しかし、Employee を拡張するクラス Contractor があるとします。そうすれば違いがわかります。

于 2012-08-29T21:28:28.973 に答える
0

あなたの例には多くの問題があります。

では、渡された配列内のオブジェクトを書き込むのではなく読み取るため、 をdisplayInfo2使用する必要があります。たとえば、そのメソッドに配列を渡したい場合、この修正を行うまで型チェックは行われません。? extends EmployeeEmployeeManager

それが修正されたらemployees.get()、どちらのメソッドでも呼び出しをキャストする必要はありません。

違いは、未知の型に名前 ( T)を付けたことだけですdisplayInfo。Java の特定の状況では、型の名前が必要になります (この投稿をリンクで編集し続けます) が、この特定の例では、気にするのはEmployee部分だけであるため、ワイルドカードだけで問題ありません。

于 2012-08-29T21:32:13.200 に答える