代码可以在eclipse中运行,但不能在javac中运行

时间:2016-05-16 13:15:09

标签: java eclipse list collections type-safety

代码

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@7852e922,但javac会出错:

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

1 个答案:

答案 0 :(得分:3)

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

更改

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

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

并且代码应该编译...假设TypeTest是Sample的子类型。