我想在运行时通过匿名内部类将方法附加到LinkedList对象。这可能吗?
例如:
LinkedList<String> paths = new LinkedList<String>() {
void addAllIfNotNull(Collection<String> c) {
if(c != null) {
addAll(c);
}
}
};
paths.add(list1);
paths.add(list2);
paths.add(list3);
...
paths.add(listN);
无需执行if(list_i不为null)addAll(list_i) ?
这看起来不可能,因为LinkedList没有AddAllIfNotNull方法。有没有办法使这项工作?
答案 0 :(得分:6)
这不可能通过匿名内部类来实现。它可以使用非匿名内部类或独立类来完成,但不是匿名的,因为编译器无法识别方法,因为编译器的变量类型为LinkedList
,如果你想要转换变量,你会把它投射到什么,因为你想要的类型是匿名的?
问题:当你尝试这个时会发生什么?当你试图调用方法时它会编译吗?
如,
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
public class LinkedListFoo {
public LinkedListFoo() {
List<String> list = new ArrayList<>();
MyLinkedList<String> paths = new MyLinkedList<>();
paths.addAllIfNotNull(list);
}
// non-anonymous inner class
private class MyLinkedList<T> extends LinkedList<T> {
void addAllIfNotNull(Collection<T> c) {
if(c != null) {
addAll(c);
}
}
}
}
答案 1 :(得分:1)
您无法使用新签名添加新方法,因为类型保留LinkedList<String>
。
执行所需操作的方法是从addAll()
覆盖现有方法LinkedList<T>
,这样:
LinkedList<String> paths = new LinkedList<String>() {
public boolean addAll(Collection<? extends String> c) {
System.out.println("In overiden addAll");
if(c != null) {
return super.addAll(c);
}
return false;
}
};
// This now works
paths.addAll(null);
答案 2 :(得分:0)
我认为应该接受Hovercraft的答案,但另一个选择是覆盖LinkedList<T>
上的某些方法 - 比如boolean addAll(Collection<? extends E> c)
,在调用{{1}之前可以进行空检查。 (有效地阻止它抛出super.addAll(c)
)。这样你就可以调用NullPointerException
并仍然使用匿名类。但是,应谨慎使用此技术。可以合理地期望addAll
在给定null参数的情况下抛出异常。使用命名类可以避免这种混淆。
答案 3 :(得分:-2)
这是不可能的,你不应该这样做。相反,使它成为一个静态方法。