具有泛型方法和参数的重载方法

时间:2015-12-05 11:59:16

标签: 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?”,这与我需要的内容很接近,但并不完全。

1 个答案:

答案 0 :(得分:4)

您不需要重载该方法,因为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;
}