当我编译我的代码时,我得到4个警告 - 但是如何让它们消失? (我不是指@SuppressWarnings)
PS:显然以前一定要问过 - 但是我找不到它,或者我不能应用它。的输出 的
warning: [unchecked] unchecked call to BaseWorker(C) as a member of the raw type BaseWorker
[warn] return new BaseWorker(this);
warning: [unchecked] unchecked conversion
[warn] found : com.crashnote.BaseWorker
[warn] required: com.crashnote.BaseWorker<C>
[warn] return new BaseWorker(this);
warning: [unchecked] unchecked call to SubWorker(C) as a member of the raw type SubWorker
[warn] return new SubWorker(this);
warning: [unchecked] unchecked conversion
[warn] found : com.crashnote.SubWorker
[warn] required: com.crashnote.SubWorker<C>
[warn] return new SubWorker(this);
源代码
BaseConfig :实例化 BaseWorker
public class BaseConfig<C extends BaseConfig> {
public BaseConfig(final Object c) {
}
public BaseWorker<C> getWorker() {
return new BaseWorker(this);
}
}
BaseWorker
public class BaseWorker<C extends BaseConfig> {
public BaseWorker(final C config) {
}
}
SubConfig :实例化 SubWorker
class SubConfig<C extends SubConfig> extends BaseConfig<C> {
public SubConfig(final Object c) {
super(c);
}
@Override
public SubWorker<C> getWorker() {
return new SubWorker(this);
}
}
SubWorker :继承自SubWorker
public class SubWorker<C extends BaseConfig> extends BaseWorker<C> {
public SubWorker(final C config) {
super(config);
}
}
修改 的
我尝试了提供的解决方案但由于某种原因它现在失败了。
A)
return new BaseWorker<BaseConfig>(this);
结果
incompatible types
[error] found : BaseWorker<BaseConfig>
[error] required: BaseWorker<C>
[error] return new BaseWorker<BaseConfig>(this);
B)
return new BaseWorker<C>(this);
结果
cannot find symbol
[error] symbol : constructor BaseWorker(BaseConfig<C>)
[error] location: class BaseWorker<C>
[error] return new BaseWorker<C>(this);
嗯,也许我做错了什么。顺便说一下,这是Java 6,如果重要的话。
答案 0 :(得分:3)
而不是返回普通的
return new BaseWorker(this);
使其成为通用的,因为您的BaseWorker
类被定义为通用。
return new BaseWorker<C>(this);
同样的规则也适用于SubWorker
。
return new SubWorker<C>(this);
<强>更新强>
基于异常消息,您的构造函数也缺少泛型。
答案 1 :(得分:2)
尝试
return new BaseWorker<C>(this);
和
return new SubWorker<C>(this);
答案 2 :(得分:0)
好吧,在应用我的代码的答案后,我发现它们实际上是错的。这似乎有用。
BaseConfig 现在有一个print()方法(以便稍后检查我们是否有正确的类型)并为 BaseWorker 的实例化添加了一个通用。
public class BaseConfig<C extends BaseConfig> {
public BaseConfig(final Object c) {
}
public BaseWorker<C> getWorker() {
return new BaseWorker<C>(this);
}
public void print() {
//
}
}
现在这是有趣的地方, BaseWorker 有一个带有泛型的构造函数。这似乎完全是多余的 - 但这是我找到的唯一方法。当您只编写<C>
时,它似乎是一个新的“本地”泛型,除了该类之外,还会引发编译器错误(cannot find symbol: method print()
)。
public class BaseWorker<C extends BaseConfig> {
public <C extends BaseConfig> BaseWorker(final C config) {
config.print();
}
}
SubConfig 和 SubWorker 会相应更改。
PS:如果这完全是胡说八道,请告诉我:)