我有这个简单的界面:
public interface Node<E extends Node<E>>
{
public E getParent();
public List<E> getChildren();
default List<E> listNodes()
{
List<E> result = new ArrayList<>();
// ------> is this always safe? <-----
@SuppressWarnings("unchecked")
E root = (E) this;
Queue<E> queue = new ArrayDeque<>();
queue.add(root);
while(!queue.isEmpty())
{
E node = queue.remove();
result.add(node);
queue.addAll(node.getChildren());
}
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
我看到它this总是Node<E>(根据定义)的一个实例.
但是我无法想象一个this不是实例的情况E......
因为E extends Node<E>,不应该也不Node<E>等同于E定义?
你能给出一个实例的对象的例子Node<E>,但它不是一个实例E吗?
与此同时,我的大脑正在融化......
上一课是一个简化的例子. …
我遇到了一个奇怪的Java行为,看起来像个bug.是吗?将对象转换为泛型类型(例如K),ClassCastException即使对象不是实例,也不会抛出K.这是一个例子:
import java.util.*;
public final class Test {
private static<K,V> void addToMap(Map<K,V> map, Object ... vals) {
for(int i = 0; i < vals.length; i += 2)
map.put((K)vals[i], (V)vals[i+1]); //Never throws ClassCastException!
}
public static void main(String[] args) {
Map<String,Integer> m = new HashMap<String,Integer>();
addToMap(m, "hello", "world"); //No exception
System.out.println(m.get("hello")); //Prints "world", which is NOT an Integer!!
}
}
Run Code Online (Sandbox Code Playgroud)
更新:感谢cletus和Andrzej Doyle提供的有用答案.因为我只能接受一个,所以我接受了Andrzej Doyle的回答,因为它让我找到了一个我认为不太糟糕的解决方案.我认为这是在单行中初始化小地图的一种更好的方法.
/**
* Creates a map with given …Run Code Online (Sandbox Code Playgroud) 所以我有一张地图:
Map<String, Class> format = new HashMap<String, Class>();
Run Code Online (Sandbox Code Playgroud)
我会像这样添加元素:
format.put("Vendor Number", Integer.class);
format.put("Vendor Dispatch", Date.class);
....
Run Code Online (Sandbox Code Playgroud)
我有一个通用的方法如下:
public static <T> T verifyType(String name, Class<T> type) {
if (type == Integer.class) {
return type.cast(new Integer(Integer.parseInt(name)));
}
......
return null;
}
Run Code Online (Sandbox Code Playgroud)
现在这段代码很好用,没有编译器问题:
Integer i = verifyType("100",Integer.class);
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试这个:
Integer i = verifyType("100",format.get("Vendor Number"));
OR
Class type = Integer.class
Integer i = verifyType("100",type);
Run Code Online (Sandbox Code Playgroud)
编译器向我显示此警告:类型安全:未经检查的调用verifyType(String,Class)的泛型方法verifyType(String,Class)
这让我感到困惑......请帮忙...