4

授業があります

abstract class A {
    //....
}

class B extends A {
    //....
}

class C extends A {
    //....
}

で、〜がある

interface Maker<T extends A> {
    SomeClass make(T obj);
}

Maker クラスの実装

class MakerForB implements Maker<B> { /*... */ }
class MakerForC implements Maker<C> { /*... */ }

および 1 つの静的メソッドを持つクラス Factory

class Factory {
    public static SomeClass makeSomeClass(A obj) {
        Maker maker = null;
        if(obj instanceof B) maker = new MakerForB();
        /* ... */
        return maker.make(obj);
    }
}

その場合、Maker をそのように宣言すると、Maker が生の型であるという警告が表示されます。

Maker<?> maker = null;

例外が発生します (引数 A に make は適用されません)

return maker.make(obj);

使用 せずにこれらの警告を取り除く最良の方法は何ですか

@SuppressWarnings("unchecked")
4

2 に答える 2

5

のすべてのジェネリックを取り除きMakerます - あなたはそれを必要としません:

interface Maker {
    SomeClass make(A obj);
}

class MakerForB implements Maker {
    SomeClass make(A obj);
}

または、それでも使用したい場合は、安全でないキャストまたはSuppressWarnings.

定義しようとするとエラーが発生する理由を理解するには:

Maker<? extends A> maker = null;

(偶然) を取得した場合を想像して、 にmaker = new MakerForC()適用してみてくださいB

于 2010-01-13T12:27:28.190 に答える
-2

あなたの質問が正しく理解できたら、置き換えてみてください。

class Factory {
    public static SomeClass makeSomeClass(A obj) {
        Maker maker = null;
        if(obj instanceof B) maker = new MakerForB();
        /* ... */
        return maker.make(obj);
    }
}

class Factory<S extends A> {
    public static SomeClass makeSomeClass(S obj) {
        Maker<S> maker = null;
        if(obj instanceof B) maker = new MakerForB();
        /* ... */
        return maker.make(obj);
    }
}

テストしていないので、他のエラーが発生した場合はお知らせください。

于 2010-01-13T12:22:09.690 に答える