为什么不将不同的泛型类型作为Java中允许的参数进行重载?
例如
private static String convertListToString(List<Character> list)
和
private static String convertListToString(List<String> list) {
导致错误。 为什么Java会这样做,并且有任何安全且流行的解决方法?
相关
完全满足我的需求,但是使用另一种语言-Overloading a method that takes a generic list with different types as a parameter
答案 0 :(得分:2)
使用相同名称但更改参数时会重载方法。
我确定您对此很熟悉,例如:
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();
}
答案 1 :(得分:1)
正如@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;
答案 2 :(得分:0)
答案是否。
示例中的泛型类型,即Character
和String
仅在编译时存在。
在运行时,List<Character>
和List<String>
变成List<Object>
。 Java对此有所了解,并避免了这种情况,从而使您出现编译时错误。
答案 3 :(得分:0)
快速答案:规范就是这样说的。 擦除类型用于解决过载。
请注意,这是编译时问题。
没有根本原因可以编写规范,而不向对象添加运行时泛型类型信息,从而将泛型信息添加到重载。但是,这将使重载规则更加复杂,并且使用原始类型的旧代码向后兼容的情况将不那么理想。
通常,最好不要重载方法。选择一个更具描述性的名称,如果该名称特别困难,则可能是方法被误导了。