java - 使用泛型方法和参数重载方法

标签 java generics methods overloading

我一直在翻阅无数的页面,试图找出是否有可能用 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/

相关文章:

java - 在文件内排序

java - 将数据添加到java中的通用集合

generics - F# 通用结构构造函数和错误 FS0670

Java 和泛型的使用?

具有通用返回类的 Java 方法签名

java - Apache Commons 解压 : IllegalArgumentException with getNextTarEntry

java - 将 csv 中写入的行数与结果集行数进行比较

java - 在 LinkedList 中添加一个点而不覆盖另一个点 - Java

methods - 为什么通过方法对结构所做的更改不会持续存在?

php - 方法可以用作array_map函数吗