var参数列表作为方法参数

时间:2014-06-25 13:30:25

标签: java

我有一个未知数量的列表(在我的示例中有两个但可能会有所不同):

    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);
          ...
      }
}

4 个答案:

答案 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)

为列表中的类型创建公共基类。

如果EmployeeObjectTest继承自同一个基类,它应该有效。