如何在 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
类型的输入集合。
我想制作一个通用方法,用于将两个链表的副本附加在一起并将其放入另一个链表。 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
类型的输入集合。