2

次のコードを使用して、抽象型 (動物) のリストから、指定されたクラス (犬、猫) に最初に一致する要素を取得しています。それを行う別のタイプセーフな方法はありますか?

// get the first matching animal from a list
public <T extends Animal>T get(Class<T> type) {
    // get the animals somehow
    List<Animal> animals = getList();
    for(Animal animal : animals) {
        if(type.isInstance(animal)) {
            // this casting is safe
            return (T)animal;
        }
    }
    // if not found
    return null;
}

// both Cat and Dog extends Animal
public void test() {
    Dog dog = get(Dog.class); // ok
    Cat cat = get(Dog.class); // ok, expected compiler error
}

(猫と犬は動物を拡張します)

4

3 に答える 3

3

コードは正しいようです。この行:

Cat cat = get(Dog.class);

確かにコンパイルしないでください。

コードのどこにも rawtypes を使用していないことを確認します。これは、一見無関係なコードのジェネリックを「オプトアウト」することが多いためです。

于 2013-01-18T13:45:25.883 に答える
3

あなたのコードでコンパイラエラーが発生します:

public void test() {
    Dog dog = get(Dog.class); // ok
    Cat cat = get(Dog.class); // compiler error
}

そして、コンパイルできるケースは1つだけです。

class Dog extends Cat {
}
于 2013-01-18T13:48:08.210 に答える
2

あなたのコードで1つのことを変更します。それ以外の

return (T)animal;

私は使うだろう

return type.cast(animal);

後者は、未チェックのキャスト警告を生成しません。

于 2013-01-18T19:34:58.433 に答える