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

和具有一种静态方法的类工厂

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")
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 回答