java - 泛型类型问题的 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 转换。
解决方案
当由于重载而导致调用哪个方法不明确时,Java 明确定义了解析顺序:
- 完全符合
- 隐式和向上转换
- 自动装箱
例如,请参阅此问题 以获取更多信息。
这就是为什么在您的情况下,Java 更喜欢将您的 char 隐式转换为 int,而不是将 char 装箱为 Character 并调用泛型重载。
List
a和方法也存在同样的问题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'));
推荐阅读
- java - 我们可以在 Spring data jpa @Query 中调用或组合 Select 和过程吗
- c# - 无法解压PDF规范的内容流
- c++ - 提升独立应用程序中的崩溃
- sql - 在目标表中插入静态行
- android - 使用 Android Camera2 API 裁剪预览图像
- postgresql - Postgres synchronous_standby_names var 不接受主机名中的“-”
- node.js - 如何将 Angular cli 安装到自定义位置
- c# - 如何使用 Dapper C# 中的对象列表从对象中进行查询
- kotlin - Kotlin 最有效的方式序列来设置
- python - Pyautogui 在 IDLE 中工作,但当我将其作为 .py 执行时则不能