为什么在 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;
答案是否定的。
泛型类型,即 示例中的Character
和String
仅在编译时存在。
在运行时,List<Character>
和List<String>
变成了List<Object>
。Java知道它,并避免这种情况给你编译时错误。
快速回答:这就是规范所说的。擦除类型用于重载解决。
请注意,这是一个编译时问题。
没有根本原因认为,如果不向对象添加运行时泛型类型信息,就无法编写规范以将泛型信息添加到重载中。但是,这将给重载规则增加更多复杂性,并且与使用原始类型的旧代码的向后兼容性故事不会那么好。
一般来说,最好不要重载方法。选择一个更具描述性的名称,如果名称特别困难,则可能是方法被误导了。