如何在java中创建具有不同泛型的构造函数

use*_*849 5 java generics constructor

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

public Data(ArrayList<String> row){
}

public Data(ArrayList<Integer> row){
}
Run Code Online (Sandbox Code Playgroud)

以上是给我一个错误说:

Method Data(ArrayListList) has the same erasure Data(ArrayList)
as another method in type Data.

我甚至尝试过:

public Data(ArrayList<?> rows) {

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

        initializeData(rows);

    }

}
Run Code Online (Sandbox Code Playgroud)

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

我试图用ArrayList或ArrayList实例化一个类(用户可以选择).

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

Data = new Data( new ArrayLIst< Integer >() );

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

Data = new Data( new ArrayLIst< Integer >() );

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

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

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

先感谢您.

sco*_*ttb 5

泛型通过擦除以Java实现.这意味着泛型类型信息仅在编译时存在,并且编译器单独负责在使用泛型时确保类型安全性.程序运行时,通用类型信息根本不存在.

运行时类文字

List<String>
Run Code Online (Sandbox Code Playgroud)

并为

List<Integer>
Run Code Online (Sandbox Code Playgroud)

两个 List.class.

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

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