我有课程
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")
答案 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);
}
}
没有测试,所以如果你现在收到其他错误,请告诉我。