我一直在翻阅无数的页面,试图找出是否有可能用 List
重载一个方法。参数,使用另一个具有通用返回参数的方法 List<E>
.我知道应该始终尽量避免这种情况,但这是一项任务,如果可能的话,我想保留这两种方法。下面是这两种方法的代码:
// This method returns an array of the info.
Object[] toArray(List data) {
Object[] array = new Object[data.size()];
for (int i = 0; i < data.size(); i++) {
array[i] = data.get(i);
}
return array;
}
// Overloaded version that uses Generics.
E[] toArray(List<E> data) {
return toArray(data);
}
我的问题是,除了更改名称之外,是否有任何方法可以区分允许两种方法同时使用的参数,并且不会导致 name clash
错误?任何帮助表示赞赏。提前致谢!
注意:有人在 StackOverflow 上问了问题“How to overload a method with generic parameter in java?”,这与我需要的很接近,但又不完全是。
最佳答案
您不需要重载该方法,因为 Java 会使用原始类型隐式地为您完成此操作。
<E> E[] toArray(List<E> data) {
如果你打电话
List objs = ...
Object[] array = toArray(objs);
如果你使用泛型,你就会得到泛型
List<String> strs =
String[] array = toArray(objs);
您遇到的真正问题是无法实现 toArray。这是因为泛型类型在运行时是未知的。例如,您不能创建 E
数组,也不能将 Object[]
转换为 String[]
。
您可以做的是传递要使用的数组类型。
public static Object[] toArray(List list) {
return toArray(list, Object.class);
}
public static <E> E[] toArray(List<? extends E> list, Class<E> eClass) {
@SuppressWarnings("unchecked")
E[] array = (E[]) Array.newInstance(eClass, list.size());
for (int i = 0; i < array.length;i++)
array[i] = list.get(i);
return array;
}
关于java - 使用泛型方法和参数重载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34104646/