0

当我编译我的代码时,我收到 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);
      }  
}

编辑

我尝试了提供的解决方案,但由于某种原因它现在失败了。

一种)

return new BaseWorker<BaseConfig>(this);

结果是

incompatible types
[error] found   : BaseWorker<BaseConfig>
[error] required: BaseWorker<C>
[error] return new BaseWorker<BaseConfig>(this);

二)

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,以防万一。

4

3 回答 3

3

而不是返回平原

return new BaseWorker(this);

使其通用,因为您的BaseWorker类被定义为通用的。

return new BaseWorker<C>(this);

同样的规则也适用SubWorker

return new SubWorker<C>(this);

更新:

根据异常消息,您的构造函数也缺少泛型。

于 2012-11-07T15:08:33.217 回答
2

尝试

 return new BaseWorker<C>(this);

 return new SubWorker<C>(this);
于 2012-11-07T15:09:24.433 回答
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();
    }
}

SubConfigSubWorker 相应更改。

PS:如果这完全是胡说八道,请告诉我:)

于 2012-11-07T16:36:28.340 回答