【问题标题】:How to make a generic concat method in java如何在java中创建一个通用的concat方法
【发布时间】:2018-03-31 02:34:49
【问题描述】:

我想创建一个通用方法来将两个链表的副本附加在一起并将其放入另一个链表中。在列表 c 中列出 a 和列表 b。

这是我目前的代码。

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;
    }
}

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

【问题讨论】:

  • 请分享确切的错误日志
  • @AmanChhabra 错误是“无法对非静态类型 T 进行静态引用”
  • 你应该能够做到这一点,而无需克隆,只需遍历第一个链表的末尾并指向第二个链表的开头。

标签: java generics linked-list generic-list


【解决方案1】:

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

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;
}

我冒昧地编辑了代码,删除了看起来多余或低效的部分。

你可以让它更通用一点,并接受包含返回类型子类的类型的输入:

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

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

【讨论】:

    猜你喜欢
    • 2019-08-01
    • 1970-01-01
    • 2012-08-23
    • 2014-12-26
    • 2014-08-01
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多