为什么不允许使用不同的泛型类型作为参数进行重载?
Why isn't overloading with a different generic type as a parameter allowed?
为什么在 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
当您使用相同的名称但更改参数时,会发生重载方法。
我相信你很熟悉,例如:
void myMethod(int something){
// implementation
}
void myMethod(int something, String somethingElse){
// implementation
}
在您的例子中,List<String>
与 List<Character>
不是不同类型的参数。泛型 class 定义为:
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 知道它并避免这种情况给你编译时错误。
快速回答:规范就是这么说的。 erased 类型 用于重载解析。
注意,这是一个编译时问题。
如果不向对象添加运行时泛型类型信息,就无法编写规范来向重载添加泛型信息,这是没有根本原因的。然而,这会给重载规则增加更多的复杂性,并且使用原始类型的旧代码的向后兼容性故事不会那么好。
通常最好不要重载方法。选择一个更具有描述性的名称,如果名称特别难,可能是方法被误导了。
为什么在 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
当您使用相同的名称但更改参数时,会发生重载方法。
我相信你很熟悉,例如:
void myMethod(int something){
// implementation
}
void myMethod(int something, String somethingElse){
// implementation
}
在您的例子中,List<String>
与 List<Character>
不是不同类型的参数。泛型 class 定义为:
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 知道它并避免这种情况给你编译时错误。
快速回答:规范就是这么说的。 erased 类型 用于重载解析。
注意,这是一个编译时问题。
如果不向对象添加运行时泛型类型信息,就无法编写规范来向重载添加泛型信息,这是没有根本原因的。然而,这会给重载规则增加更多的复杂性,并且使用原始类型的旧代码的向后兼容性故事不会那么好。
通常最好不要重载方法。选择一个更具有描述性的名称,如果名称特别难,可能是方法被误导了。