为什么不允许使用不同的泛型类型作为参数重载?



为什么在 Java 中不允许使用不同的泛型类型作为参数重载?

例如

private static String convertListToString(List<Character> list)

private static String convertListToString(List<String> list) {

导致错误。 为什么Java这样做,是否有任何安全和流行的解决方法?

相关

完全符合我的需要,但使用不同的语言 - 重载将不同类型的泛型列表作为参数的方法

当您使用相同的名称但更改参数时,会发生重载方法。

我相信你对此很熟悉,例如:

void myMethod(int something){
// implementation
}
void myMethod(int something, String somethingElse){
// implementation
}

在您的情况下,List<String>List<Character>参数类型不同。泛型类定义为:

List<T>{
// class implementation, a list that manages objects of type 'T'
}

编辑

为了解决这个问题,创建一个泛型方法,其中类型(List<T>(的每个列表都转换为String。每个Object都有一个toString()方法!

static <T> String convertToString(List<T> list){
StringBuilder sb = new StringBuilder();
// assuming list is not null of course
for (T item : list) {
sb.append(item.toString());
}
return sb.toString();
}

如@Themelis所述,您不能这样做,因为它们本质上是相同的参数。但是,您可以通过使用泛型来解决此问题,如下所示:

private static <T> String convertListToString(List<T> list) {
// Your code here.
}

在方法主体内部,可以遍历并调用泛型上的 toString 方法。

String s = "";
for (int i = 0; i < list.size(); i++) {
s += list.get(i).toString();
}
return s;

答案是否定的

泛型类型,即 示例中的CharacterString仅在编译时存在。

在运行时,List<Character>List<String>变成了List<Object>。Java知道它,并避免这种情况给你编译时错误。

快速回答:这就是规范所说的。擦除类型用于重载解决。

请注意,这是一个编译时问题。

没有根本原因认为,如果不向对象添加运行时泛型类型信息,就无法编写规范以将泛型信息添加到重载中。但是,这将给重载规则增加更多复杂性,并且与使用原始类型的旧代码的向后兼容性故事不会那么好。

一般来说,最好不要重载方法。选择一个更具描述性的名称,如果名称特别困难,则可能是方法被误导了。

最新更新