【问题标题】:a code can run in eclipse, but not javac代码可以在 eclipse 中运行,但不能在 javac 中运行
【发布时间】:2016-05-16 13:15:09
【问题描述】:

代码

import java.util.*;

interface Sample{

}

public class TypeTest implements Sample{
    public static void main(String[] args) {
        Set<Object> objs = new HashSet<>();
        objs.add(new TypeTest());
        List<? extends Sample> objList = (List<? extends Sample>) new ArrayList<>(objs);
        for (Sample t : objList) {
            System.out.println(t.toString());
        }
    }
}

它可以在eclipse中运行并输出TypeTest@7852e922javac会报错:

incompatible types: ArrayList<Object> cannot be converted to List<? extends Sample>

【问题讨论】:

  • 您的系统上是否安装了 2 个不同的 JDK?
  • 什么版本的javac?您的 Eclipse 项目配置为使用什么 Java 级别?
  • 顺便说一句,如果您使用最新版本的 Java (7+),我认为您甚至不需要演员表;编译器可以从变量声明中暗示实例化的类型参数。
  • 我能够通过 jdk 1.8 和 Eclipse 4.5 使用相同的 jdk 重现此问题。问题似乎类似于...stackoverflow.com/q/2858799/1069114stackoverflow.com/q/3000177/1069114
  • 是的 Eclipse 允许这样做,是错误的。虽然老实说:钻石运算符加演员不正当的。

标签: java eclipse list collections type-safety


【解决方案1】:

此代码不应编译。问题是new ArrayList&lt;&gt;(objs) 的推断类型是ArrayList&lt;Object&gt;,因为您已将Set&lt;Object&gt; 作为参数传递给构造函数。但ArrayList&lt;Object&gt; 不是List&lt;? extends Sample&gt; 的子类型。

改变

    Set<Object> objs = new HashSet<>();

    Set<? extends Sample> objs = new HashSet<>();

如果 TypeTest 是 Sample 的子类型,代码应该可以编译。

【讨论】:

  • 我同意你的观点,但 eclipse 允许这样做。 eclipse有什么理由这样做吗?
  • '因为 Eclipse 编译器有问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多