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

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;

答案是

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

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

快速回答:规范就是这么说的。 erased 类型 用于重载解析。

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

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

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