Java 带有泛型方法和参数的重载方法

Java 带有泛型方法和参数的重载方法,java,generics,methods,overloading,Java,Generics,Methods,Overloading,我已经翻阅了无数页,试图弄清楚是否有可能用List参数重载一个方法,用另一个具有通用返回参数List的方法重载一个方法。我知道这应该尽量避免,但这是一个作业,如果可能的话,我想把这两种方法都包括在内。以下是两种方法的代码: // This method returns an array of the info. Object[] toArray(List data) { Object[] array = new Object[data.size()]; for (int i =

我已经翻阅了无数页,试图弄清楚是否有可能用
List
参数重载一个方法,用另一个具有通用返回参数
List
的方法重载一个方法。我知道这应该尽量避免,但这是一个作业,如果可能的话,我想把这两种方法都包括在内。以下是两种方法的代码:

// 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);
}
//此方法返回一个信息数组。
对象[]到阵列(列表数据){
Object[]数组=新对象[data.size()];
对于(int i=0;i
我的问题是,除了更改名称外,是否有任何方法可以区分允许两种方法就位的参数,并且不会导致
名称冲突
错误?感谢您的帮助。提前谢谢你


注意:有人在StackOverflow上问了一个问题“”,这个问题与我所需要的接近,但不完全相同。

您不需要重载该方法,因为Java会隐式地为您处理原始类型

<E> E[] toArray(List<E> data) {
如果你使用泛型,你就会得到泛型

List<String> strs =
String[] array = toArray(objs);

您不需要重载该方法,因为Java使用原始类型隐式地为您实现了这一点

<E> E[] toArray(List<E> data) {
如果你使用泛型,你就会得到泛型

List<String> strs =
String[] array = toArray(objs);

你不能按照你建议的方式去做,你必须改变一些事情。在运行时,泛型名称会被删除,因此实际上您有两个具有相同签名的方法,这就是为什么它永远不会工作的原因。我建议您阅读Java6中有一种方法,但这是由于编译器中的一个bug已经修复。简而言之,不,您不能这样做。您还可以从编译器的错误消息中得到提示。它告诉你什么?你不能按照你建议的方式去做,你必须改变一些东西。在运行时,泛型名称会被删除,因此实际上您有两个具有相同签名的方法,这就是为什么它永远不会工作的原因。我建议您阅读Java6中有一种方法,但这是由于编译器中的一个bug已经修复。简而言之,不,您不能这样做。您还可以从编译器的错误消息中得到提示。它告诉你什么?+1。我想提出一个好的观点。JLS 15.12.2规定,当重载一个方法时,其中一个采用参数
C
,另一个采用超类型或子类型
C
,为层次结构中较高的类型选择的方法是更具体的方法。然而,根据JLS 4.2.10,《代码》列表是《代码》列表的一个超类型,因此人们可能会认为,在《代码》列表是更具体的地方,这种重载是可能的。关于泛型的细微之处表明情况并非如此。我想提出一个好的观点。JLS 15.12.2规定,当重载一个方法时,其中一个采用参数
C
,另一个采用超类型或子类型
C
,为层次结构中较高的类型选择的方法是更具体的方法。然而,根据JLS 4.2.10,《代码》列表是《代码》列表的一个超类型,因此人们可能会认为,在《代码》列表是更具体的地方,这种重载是可能的。关于泛型的细微之处表明情况并非如此。