代码之家  ›  专栏  ›  技术社区  ›  Marvin

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

  •  0
  • Marvin  · 技术社区  · 6 年前

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

    3 回复  |  直到 6 年前
        1
  •  1
  •   Zack R    6 年前

    正如@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
  •  1
  •   Themelis    6 年前

    当使用相同的名称但更改参数时,会发生方法重载。

    我相信你对此很熟悉,例如:

        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();
        }
    
        3
  •  0
  •   Oleg Cherednik    6 年前

    答案是 .

    泛型类型,即 Character String 在您的示例中,只存在于编译时。

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