java - 为什么 Eclipse Java 编译器会提示内部派生类型的转换未经检查?

标签 java generics compiler-warnings

考虑以下通用类 Base<ID>具有非静态内部类。

public class Base<ID> {
  ID id;

  public Base(ID id) {
    this.id = id;
  }

  public ID getId() {
    return id;
  }

  protected class BaseInner {
    String text = "Inner";
  }

  protected void method(BaseInner o) {
    o.text = "Foo";
  }
}

方法Base.method采用 BaseInner 类型的参数.现在考虑以下派生类。

public class Sub<ID> extends Base<ID> {
  public Sub(ID id) {
    super(id);
  }

  @Override
  protected void method(BaseInner o) {

    if (o instanceof Sub.SubInner) {
      SubInner sub = (SubInner) o; // Why does this cast emit an "unchecked cast" warning

      sub.text = "Bar";
      sub.value = 1337;
    }
  }

  protected class SubInner extends BaseInner {
    Number value = 42;
  }
}

类(class)Sub源自 Base和内部类 SubInner派生自内部类 BaseInner .泛型类型参数 IDSub作为类型参数传递给基类 Base .

我的问题:为什么编译器会提示来自 BaseInner 的转换?至 SubInner在重写 methodSub

为了理解警告,我尝试构建一个用例,其中 methodSub<A>被一些 Sub<B>.SubInner 调用这证明了警告。但是,如果类型不兼容,我能想到的任何东西(包括 ? extends? super)都会在方法调用时发出编译器错误。

所以我想没有理由在 method 中发出未经检查的类型转换警告。 .我错过了什么吗?

由于方法覆盖发生在 Sub<ID> 中实现,编译器能够推导出 SubInner 的泛型类型至 Sub<ID>.SubInner .所以质疑这不是重复!

Eclipse 编译器警告是

Type safety: Unchecked cast from Base<ID>.BaseInner to Sub<ID>.SubInner

即使我使用 Base<ID>.BaseInner 警告也不会改变作为方法参数,如果我使用 Sub<ID>.SubInner在类型转换中。

最佳答案

这似乎是 Eclipse 编译器问题。

Oracle 编译器 (javac) 不会忽略此处的任何警告。

关于java - 为什么 Eclipse Java 编译器会提示内部派生类型的转换未经检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38629399/

相关文章:

java - 值类型困惑

java - 通过参数指定泛型类型信息

c# - .NET 非/通用列表存储在堆栈还是堆上?

gcc - 如何抑制 GCC 编译器警告 : inline variables are only available with -std=c++1z or -std=gnu++1z

c++ - 转换到 `void` 的真正作用是什么?

java - 切换到 Java 8 后 Webdriver 断言失败

java - JTabbedPane 不会填满整个 JPanel

javafx如何在FXML Controller 中controlfx对话框

c# - 泛型双接口(interface)

c - 如果我初始化一个结构但缺少一个元素,GCC 中是否有任何标志来警告我?