首页 > 解决方案 > 泛型类型问题的 JAVA 函数重载

问题描述

class Test<T>返回整数的方法....

public int getIndex(T a) //generic parameter
    {
        return 1; // purposely left simple
    }

一个默认大小为 5 的数组实例化:boolean[] arr = new boolean[5]; 现在我有几个重载函数,特意让它变得简单....

public void add(T a) // generic parameter
    {
        add(getIndex(a));
    }

public void add(int a)
{
        //boolean array with default size 5
        arr[a] = true;
    }
}

主要:

public static void main(String[] args) {
     Test<Character> test = new Test<Character>();
     test.add('A'); // throws exception
} 

它总是给我arrayOutOfBoundException: 65

据我了解,编译器仅将字符识别为 ASCII 整数值,而不是使用泛型类型参数调用方法,为什么会发生这种情况,我该如何使其工作?编辑:当我声明一个字符串类型的测试时,我让它工作了,因为没有涉及 ASCII 转换。

标签: javacastingtype-conversionoverridingoverloading

解决方案


当由于重载而导致调用哪个方法不明确时,Java 明确定义了解析顺序:

  • 完全符合
  • 隐式和向上转换
  • 自动装箱

例如,请参阅此问题 以获取更多信息。

这就是为什么在您的情况下,Java 更喜欢将您的 char 隐式转换为 int,而不是将 char 装箱为 Character 并调用泛型重载。

Lista和方法也存在同样的问题remove。考虑:

List<Integer> l = new ARrayList<>();
l.add(10);
l.remove(10); // crash because it calls remove(int) rather than remove(E) with E=Integer

解决方案是不要依赖自动装箱。例如,对于上面的列表,您可以编写:

l.remove(Integer.valueOf(10));

因此,在您的情况下:

test.add(Character.valueOf('a'), Character.valueOf('b'));

推荐阅读