这是我的代码。我试图测试我的bubbleSort方法..
import java.util.ArrayList;
import java.util.List;
public class MyArrayList<T extends Comparable<? super T>> extends ArrayList<Comparable<T>> {
private static final long serialVersionUID = 1L;
private MyArrayList<T> myList; // class list
public MyArrayList(ArrayList<Comparable<T>> asList) {
for (Comparable<T> e: asList) {
myList.add(e);
}
}
public void bubbleSort() {
boolean swapped = true;
while (swapped) {
swapped = false;
for (int i = 0; i < this.size() - 1; i++) {
if (this.get(i).compareTo((T) this.get(i + 1)) > 0) {
swapped = true;
Comparable<T> temp = this.get(i);
this.set(i, this.get(i + 1));
this.set(i + 1, temp);
}
}
}
}
}
在我的测试类中,我无法创建列表来测试我的bubbleSort方法。我想尝试创建一个Integer列表(来自一个数组),一个String列表和其他一些列表,但我不断收到各种错误。
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
public class MyArrayListTest<T> {
public void setUp() {
Integer[] testIntArray = new Integer[]{0, 1, 2, 3};
MyArrayList<Integer> myList = new MyArrayList<Integer>(Arrays.asList(testIntArray));
}
}
为什么这不起作用的任何想法,以及如何创建MyArrayList?
答案 0 :(得分:3)
您应该从以下位置更改构造函数:
public MyArrayList(ArrayList<Comparable<T>> asList)
为:
public MyArrayList(List<T> asList)
Arrays.asList
没有返回java.util.ArrayList
,这就是new MyArrayList<Integer>(Arrays.asList(testIntArray))
无法编译的原因。 Arrays.asList
返回Arrays
类中定义的嵌套类的实例,该类也称为ArrayList
,但更重要的是,Arrays.asList(T... a)
的返回类型为List<T>
}。
答案 1 :(得分:3)
这里有几个问题。
首先,一旦您宣布列表的基本类型具有可比性,您就不应该再使用Comparable<T>
了。这实际上是破坏你的构造函数的原因。它需要一个Comparable
的列表,并获得Integer
的列表。虽然Integer
是Comparable
,但List<Integer>
不是List<Comparator>
。这是两种不同的类型。
其次,正如您被告知的那样,方法Arrays.asList()
会返回List
,并且在没有类型转换的情况下与ArrayList
不分配兼容(并且会在类型转换时失败) ,因为它不是java.util.ArrayList
)。
因此,构造函数的声明实际应该是
public MyArrayList(List<T> asList)
您的循环变量e
也应声明为T
。基本的事实是Java已经知道T
扩展Comparable
所以它知道它有compareTo()
方法。
但是由于构造函数声明,您还遇到了一个逻辑错误。实际上,MyArrayList
中有两个集合。一个是字段 myList
,另一个是this
。由于您要延长ArrayList
,this
是 ArrayList
。
在构造函数中,您将数据添加到myList
。但是在排序方法中,您正在比较和交换this
中的数据!这意味着它可能会尝试对空列表进行排序,因为您没有在构造函数中填充它(除非您从主程序中调用它的add
方法)。
事实上,向myList
添加信息可能会导致NullPointerException
,因为您没有初始化myList
而您无法这样做,因为它是MyArrayList
,并且只有基于List的构造函数,如果你将使用它,它将发送一个无限循环并最终得到Stack Overflow。
列表本身应该扩展ArrayList<T>
而不是ArrayList<Comparable<T>>
。同样,已知T
扩展Comparable
。然后,您可以声明temp
变量T
而不是Comparable<T>
。也不必将参数转换为T
,因为它已经是T
,是this
的基本类型。