java泛型和SuppressWarnings

vrm*_*vrm 4 java generics warnings static-methods

我有课

abstract class A {
    //....
}

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

class C extends A {
    //....
}
Run Code Online (Sandbox Code Playgroud)

然后我有

interface Maker<T extends A> {
    SomeClass make(T obj);
}
Run Code Online (Sandbox Code Playgroud)

Maker类的实现

class MakerForB implements Maker<B> { /*... */ }
class MakerForC implements Maker<C> { /*... */ }
Run Code Online (Sandbox Code Playgroud)

和类Factory一个静态方法

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

在那种情况下,当我以这种方式宣布Maker时,我得到Maker是原始类型的警告

Maker<?> maker = null;
Run Code Online (Sandbox Code Playgroud)

我得到异常(make不适用于参数A)

return maker.make(obj);
Run Code Online (Sandbox Code Playgroud)

使用的 情况下摆脱这些警告的最佳方法是什么

@SuppressWarnings("unchecked")
Run Code Online (Sandbox Code Playgroud)

Boz*_*zho 5

摆脱所有的泛型Maker- 你不需要它:

interface Maker {
    SomeClass make(A obj);
}

class MakerForB implements Maker {
    SomeClass make(A obj);
}
Run Code Online (Sandbox Code Playgroud)

或者如果您仍然想要使用它,请使用不安全的演员表或使用SuppressWarnings.

要了解为什么在尝试定义时出现错误:

Maker<? extends A> maker = null;
Run Code Online (Sandbox Code Playgroud)

想象一下当你(偶然)得到maker = new MakerForC()并尝试应用它时的情况B.