为什么实现接口的类不算与Java中的接口类型相同?

Rit*_*ose 4 java generics inheritance types

我有

out.load(output, transactions, columnHeaders, dataFormat);
Run Code Online (Sandbox Code Playgroud)

在哪里load定义为:

public boolean load(String outputfile, List<Transaction> transactions, List<String> columnHeaders, String dataFormat);
Run Code Online (Sandbox Code Playgroud)

String output = "";
String dataFormat = "";
ArrayList<ARTransaction> transactions = new ArrayList<ARTransaction>();
List<String> columnHeaders = null;
Run Code Online (Sandbox Code Playgroud)

哪里

ARTransaction implements Transaction
Run Code Online (Sandbox Code Playgroud)

为什么类型有问题transactions

Mar*_*ers 12

public boolean load(String outputfile, List<? extends Transaction> transactions, List<String> columnHeaders, String dataFormat);
Run Code Online (Sandbox Code Playgroud)

或者只是将交易声明为List<Transaction>.

以下是为什么你显然不能这样做的常见例子:

List<String> list = new ArrayList<String>();
List<Object> objList = list; //if this were possible
objList.add(Integer.valueOf(5));
String val = list.get(0);  //ClassCastException here
System.out.println(val);
Run Code Online (Sandbox Code Playgroud)

  • 不,Java会认为它是Transaction的一些未知子类的List.这种情况下的实际类型对于`load`是未知的.如果重要,可以考虑在load方法中添加一个类型参数(`T extends Transaction`). (3认同)