0

このコンパイル エラーが発生する理由がわかりません

境界の不一致: element(T)type のジェネリック メソッドはResource、引数 ( ) には適用できませんClass<Chassis>。推論された型Class<Chassis>は、境界付きパラメーターの有効な代替ではありません<T extends Resource>

次のコードを使用します。

public class Resource {
    protected abstract class has<T extends Resource> {
        public has(T v) {}
    }

    protected <T extends Resource> has element(T v) {
        return new has<T>(v) {};
    }
}

class Car extends Resource {
    has chassis = element(Chassis.class);
}

class Chassis extends Resource {
}

なぜこれが無効なのですか?ChassisextendsResourceであるのに、なぜ と一致しないの<T extends Resource>ですか?

また、 Resource クラス オブジェクトまたは Resource サブクラス オブジェクトを引数として受け入れるように element() メソッドを制約するにはどうすればよいでしょうか?

4

1 に答える 1

4

Chassis.classは、java.lang.Classのみを拡張する のインスタンスですjava.lang.Object

(またはそのサブクラスの 1 つ)<T extends Resource>の実際のインスタンスが必要です。Resource

これを解決するには、メソッド宣言を次のように変更します。

protected <T extends Resource> has element(Class<T> v) {
    return new has<T>(v) {};
}
于 2012-12-04T03:23:21.727 に答える