我有一个未知数量的列表(在我的示例中有两个但可能会有所不同):
SimpleDateFormat sdf = new SimpleDateFormat("yyyy, MM, dd");
List<Employee> employees = new ArrayList<Employee>();
employees.add(new Employee(100, "Abe Adams", sdf
.parse("2009, 12, 1"), 10000.00));
employees.add(new Employee(101, "Betty Barnes", sdf
.parse("2010, 11, 1"), 11000.00));
employees.add(new Employee(102, "Caleb Crown", sdf
.parse("2011, 10, 1"), 12000.00));
employees.add(new Employee(103, "Dirk Daniels", sdf
.parse("2012, 09, 1"), 13000.00));
Date date = new Date();
List<ObjectTest> objects = new ArrayList<ObjectTest>();
objects.add(new ObjectTest("name",date,10.0));
objects.add(new ObjectTest("name2",date,20.0));
我想在记忆中使用它们作为arg
oReport.writeReportToExcel(employees,objects);
与
public <T> void writeReportToExcel(List <T> ... varArrayData ) {
...
}
我必须使用var args参数,但编译器会拒绝代码 需要改变什么?
编译器的消息是
method writeReportToExcel in class Bean2Excel cannot be applied to given types;
required: List<T>[]
found: List<Employee>, List<ObjectTest>
reason: inferred type does not conform to equality constraint(s)
inferred: ObjectTest
equality constraint(s): ObjectTest, Employee
where T is a type-variable:
T extends Object declared in method <T> wirteReportToExcel(List<T> ...)
编辑解决方案(可能是一种肮脏的方式)
Bean2Excel oReport = new Bean2Excel();
List recapList = new ArrayList();
recapList.add(employees);
recapList.add(objects);
oReport.writeReportToExcel(recapList);
正如建议我删除了泛型
public void writeReportToExcel(List datas) {
try {
Bean2Excel oReport = new Bean2Excel();
for (int i = 0;i<datas.size();i++){
List data = (List)datas.get(i);
...
}
}
答案 0 :(得分:2)
参数是不同类型的,T。您可以删除通用定义,使它们实现一个通用接口。
你必须使用var args吗?
答案 1 :(得分:1)
如上所述,我会创建一个通用界面,让我们说WritableToExcel
或其他东西,然后使用通配符:
public void writeReportToExcel(List<? extends WritableToExcel>... varArrayData) { }
现在,您可以阅读方法内的列表,并从WritableToExcel
调用方法来编写表格。
答案 2 :(得分:1)
&LT; T&GT;应该是方法中的指定类型。例如,Employee或ObjectTest。 但是一旦你在一个方法中定义了两种不同的类型,并尝试应用于名为varArrayData的List&lt; T&gt; [],编译将拒绝这样做,因为它无法确保T表示Employee.class或ObjectTest.class。
如果您确实想使用var args,请删除&lt; T&gt;方法签名中的标记可能有效:
public void writeReportToExcel(List ... varArrayData ) {
...
}
或者您可以将类型定义放入类离开:
public class Bean2Excel<T>{
public void writeReportToExcel(List<T> ... varArrayData ) {
...
}
}
希望它有所帮助。
答案 3 :(得分:0)
为列表中的类型创建公共基类。
如果Employee
和ObjectTest
继承自同一个基类,它应该有效。