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

时间:2019-09-22 21:36:16

标签: java generics overloading

为什么不将不同的泛型类型作为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

4 个答案:

答案 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)

答案是

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

在运行时,List<Character>List<String>变成List<Object>。 Java对此有所了解,并避免了这种情况,从而使您出现编译时错误。

答案 3 :(得分:0)

快速答案:规范就是这样说的。 擦除类型用于解决过载。

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

没有根本原因可以编写规范,而不向对象添加运行时泛型类型信息,从而将泛型信息添加到重载。但是,这将使重载规则更加复杂,并且使用原始类型的旧代码向后兼容的情况将不那么理想。

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