试图创建和测试类似的arraylist类

时间:2015-04-10 19:31:17

标签: java generics arraylist

这是我的代码。我试图测试我的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?

2 个答案:

答案 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的列表。虽然IntegerComparable,但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。由于您要延长ArrayListthis 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的基本类型。