我有以下类(简化但仍然是一个工作示例):
class Test<T> {
List<T> l = new ArrayList<>();
public Test() {
}
public void add(Object o) {
l.add((T)o);
}
}
Run Code Online (Sandbox Code Playgroud)
和测试代码:
Test<Double> t = new Test<>();
t.add(1);
t.add(1.2);
t.add(-5.6e-2);
t.add("hello");
Run Code Online (Sandbox Code Playgroud)
一切都很好,这不是我所期待的.该add
方法不应该扔一个ClassCastException
?如果我添加一个get
或多或少相同的方法:
public T get(int i) {
return l.get(i);
}
.../...
t.get(1); // OK.
t.get(3); // OK (?)
Double d = t.get(3); // throws ClassCastException
Run Code Online (Sandbox Code Playgroud)
为什么仅在变量赋值时抛出异常?如果强制转换(T)
不起作用,我如何强制执行类型一致性?
我遇到了一个奇怪的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) 这是我放在一起的一个小例子:
private static <T> T getValue(T defaultValue) {
if (defaultValue instanceof Boolean) {
return (T) true;
}
return defaultValue;
}
Run Code Online (Sandbox Code Playgroud)
基本上,如果T是布尔类型,我希望返回"true".但是,我得到一个编译错误,布尔值不能强制转换为T.
我该怎么做?
还有,有办法检查T是否是boolean类型?问候.