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)
摆脱所有的泛型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
.
归档时间: |
|
查看次数: |
512 次 |
最近记录: |