如何在 java 中制作通用的 concat 方法

How to make a generic concat method in java

我想制作一个通用方法,用于将两个链表的副本附加在一起并将其放入另一个链表。 list a 和 list b in list c.

这是我目前的代码。

public static LinkedSequence<?> concatenaton(LinkedSequence<?> s1, LinkedSequence<?> s2) throws java.lang.NullPointerException
{
    // Create a new sequence that contains all the elements from one sequence followed by another.
    LinkedSequence<?> concat = new LinkedSequence();
    if(s1 == null || s2 == null) {
        return null;
    }
    else {
        LinkedSequence h1;
        LinkedSequence h2;
        h1 = s1.clone();
        h2 = s2.clone();
        concat.addAll(h1);
        concat.addAll(h2);
    }
    return concat;


}

public LinkedSequence<T> clone() {
    // Generate a copy of this sequence.
    LinkedSequence<T> copy = new LinkedSequence<T>();
    //Node<T> newNode = new Node<T>(element);
    Node<T> curr = first;
    if(getCurrent() == null) {
        return null;
    } else {
        while(curr != null) { //iterate through current list
            copy.addLast(curr.getValue());
            curr = curr.getLink();
        }
    }
    return copy;
}

public void addLast(T element) {
    Node<T> newNode = new Node<T>(element);
    if (isCurrent() == false) {
        current = newNode;
        first = newNode;
        last = newNode;
    }
    else {
        //Node newNode = new Node(element);
        last.setLink(newNode);
        last = newNode;
    }
}

克隆将整个列表复制到一个新列表中。 我一直收到一条错误消息,说我在静态类型中创建了泛型。

有一件事是肯定的...您需要在 concat 静态方法中使用 type-parameter 来施加约束,即两个输入序列具有相同的元素类型,如下所示:

public static <E> LinkedSequence<E> concat(LinkedSequence<E> s1, LinkedSequence<E> s2) {
    if(s1 == null || s2 == null) {
        return null;
    }
    LinkedSequence<E> concat = new LinkedSequence<>();
    concat.addAll(s1);
    concat.addAll(s2); 
    return concat;
}

我冒昧地对代码进行了一些修改,删除了一些看似多余或低效的内容。

您可以使其更通用一些,并接受包含 return 类型子类的类型的输入:

public static <E> LinkedSequence<E> concat(LinkedSequence<? extends E> s1, LinkedSequence<? extends E> s2) { ... }

您可能需要更改 addAll 定义以接受 ? extends E 而不是 E 类型的输入集合。