JAVA函数重载与泛型类型问题

标签 java casting type-conversion overriding overloading

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 整数值,而不是使用泛型类型参数调用方法,为什么会发生这种情况,我该如何使其工作? 编辑:当我声明 String 类型的 Test 时,我让它工作了,因为不涉及 ASCII 转换。

最佳答案

'A'的类型为char。在Java中,char是数字类型,因此可以将其赋值给int。此外,当有两个重载方法时 - 一个采用 int,另一个采用装箱类型 Character - 您将得到 int 一个:

class Test {
    static void method(int a) {
        System.out.println("int");
    }
    static void method(Character a) {
        System.out.println("Character");
    }
}
> Test.method('A');
int

特别是,'A' 的整数值为 65,因为这是它的 Unicode 值。因此,您实际上是使用值 65 调用 add(int) 方法,而不是 add(Character) 方法,因此是 IOOBE。

要修复此问题,请在调用方法时显式转换为 Character,或者将名称更改为 addByIndexaddByValue,以便 Java 获胜不要根据参数类型选择错误的类型。

<小时/>

要了解 Java 为什么选择 add(int) 方法而不是 add(Character),需要深入了解 Java 语言规范。节§15.12指定如何解析方法调用:

The first phase (§15.12.2.2) performs overload resolution without permitting boxing or unboxing conversion, or the use of variable arity method invocation. If no applicable method is found during this phase then processing continues to the second phase.

因此 add(int) 方法在第一阶段匹配,因为从 char 转换为 int 不是装箱或拆箱转换;并且选择该方法时无需进入方法解析的第二阶段,在该阶段中允许从 charCharacter 的装箱转换。

关于JAVA函数重载与泛型类型问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59206952/

相关文章:

java - 如何在使用 hibernate 对数据库进行任何更改或更新时获得警报

angular - 将数字类型转换为 BigDecimal TypeScript(Angular)

C++:将 int 转换为 char 不会产生正确的值

python - 运算符不存在 : character varying + character varying

c++ - 更喜欢 std::variant<bool, std::string> 中的 std::string for const char *

python - 将矩阵转换为列表

swift - swift 将 uint32 值拆分为 uint8 值

java - JProfiler 可以测量堆栈深度吗?

java - 如何组合一个时间戳的日期和另一个时间戳的时间?

java - 为什么注释处理在 maven 构建期间运行多次