1

我正在尝试做这样的事情,它编译得很好:

public interface Training {
    public void train();
}

public class JavaTraining implements Training{

    @Override
    public void train() {
        // TODO Auto-generated method stub

    }


}

import java.util.*;

public class TestClass {

    /**
     * @param args
     */
    public static void main(String[] args) {
        List<Training> trainingList = new ArrayList<Training>();
        trainingList.add(new JavaTraining());
        for(Training trainingItem : trainingList){
            trainingItem.train();
        }

    }

}

这编译得很好并且也可以运行。

但是,当我尝试更改如下所示的主要方法时,会出现编译时错误。

这是为什么?

import java.util.*;

public class TestClass {

    /**
     * @param args
     */
    public static void main(String[] args) {
        List<Training> trainingList = new ArrayList<JavaTraining>();
    }

}

编译时错误是:

“类型不匹配:无法从 ArrayList 转换为 List”

我什至在这里读过一篇文章。但这并不能消除我的疑问。

这个问题不是重复的,因为我没有在任何地方使用过

List<? extends Training>

但它仍然接受 JavaTraining 的对象。如何?

4

2 回答 2

8

这就是你不能这样做的原因:

List<JavaTraining> jt = new ArrayList<JavaTraining>(); // So far so good
List<Training> trainingList = jt; // This is what you did; let's pretend it compiles
trainingList.add(new CobolTraining()); // The compiler must allow this, because `CobolTraining` is a `Training`.

上面的问题是它可以让你把一个CobolTraining放入jt,一个列表中JavaTraining

于 2013-05-19T10:31:13.887 回答
2

这是由于泛型是如何设计的。ArrayList<JavaTraining>不延长ArrayList<Training>

你应该做

  List<? extends Training> trainingList = new ArrayList<JavaTraining>();

检查通配符的使用。

于 2013-05-19T10:27:55.453 回答