5

我有一个类,以下是它的构造函数

public Data(ArrayList<String> row){
}

public Data(ArrayList<Integer> row){
}

以上是给我一个错误说:

方法 Data(ArrayListList) 具有相同的擦除 Data(ArrayList)
作为数据类型中的另一种方法。

我什至尝试过这样做:

public Data(ArrayList<?> rows) {

    if (rows.get(0) instanceof String) {

        initializeData(rows);

    }

}

但在上面,我必须将整个 ArrayList 转换为 ArrayList。我认为这是低效的。

我正在尝试使用 ArrayList 或 ArrayList 实例化一个类(用户可以选择)。

Data = new Data( new ArrayList< String >() );

Data = new Data( new ArrayLIst< Integer >() ); 所以以上两个都应该工作。根据传递的输入参数的类型,类将调用不同的方法。

有没有更好的实现我想要的?

先感谢您。

4

3 回答 3

6

泛型是通过擦除在 Java 中实现的。这意味着泛型类型信息仅在编译时存在,并且编译器本身有责任在使用泛型时确保类型安全。当您的程序运行时,泛型类型信息根本不存在。

运行时类文字

List<String>

并且对于

List<Integer>

都是。_ List.class

这就是为什么编译器不允许您为仅在泛型类型参数上有所不同的集合提供重载构造函数的原因。从运行时环境的角度来看,这两种参数类型是相同的。

作为一种解决方法,您可以将每个通用 ArrayList 类型包装在其自己不同的帮助器类中。这将允许您提供重载的构造函数,这些构造函数将每个帮助类作为其参数。

于 2013-11-08T05:19:25.047 回答
1

你不能这样做,错误告诉你泛型将在编译时被删除,你最终会得到 2 个具有相同签名的构造函数。

您可以探索的几个选项:

public Data(String[] row)
public Data(Integer[] row)

或者:

public class Data<T> {
    public Data(List<T> row);
}

new Data<String>(new ArrayList<String>())
于 2013-11-08T04:35:10.220 回答
0

您可以通过将 ArrayList 扩展到具体类型来做到这一点,

例如

public class IntegerArrayList extends ArrayList<Integer>{};

但是,您真正想要这样做的情况非常罕见,您确定需要这样做吗?构造函数如何相互区分?

于 2013-11-08T04:50:02.310 回答