java泛型和SuppressWarnings

时间:2010-01-13 12:17:41

标签: java generics warnings static-methods

我有课程

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> { /*... */ }

和类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;

我在

上得到例外(make不适用于参数A)
return maker.make(obj);

在没有使用

的情况下,消除这些警告的最佳方法是什么?
@SuppressWarnings("unchecked")

2 个答案:

答案 0 :(得分: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时的情况。

答案 1 :(得分:-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);
    }
}

没有测试,所以如果你现在收到其他错误,请告诉我。