我有一节简单的课
public class ObjectUtility {
public static void main(String[] args) {
System.out.println(castToType(10,new HashMap<Integer,Integer>()));
}
private static <V,T> T castToType(V value, T type){
return (T) value;
}
}
这将输出为10,没有任何错误!!!我原以为这会给我一个ClassCastException,其中有些错误,比如Integer不能转换为HashMap。
出于好奇和愤怒,我尝试了getclass()
返回值,如下所示
System.out.println(castToType(10,new HashMap<Integer,Integer>()).getClass());
Object o = castToType(10,new HashMap<Integer,Integer>());
System.out.println(o.getClass());
openjdk version "1.7.0_181"
OpenJDK Runtime Environment (Zulu 7.23.0.1-macosx) (build 1.7.0_181-b01)
OpenJDK 64-Bit Server VM (Zulu 7.23.0.1-macosx) (build 24.181-b01, mixed mode)
t
在运行时不存在。它解析到约束的下界。在本例中,没有,所以它解析为object
。所有内容都可以转换为object
,因此类转换不会异常。
如果要将约束更改为
private static <V,T extends Map<?,?>> T castToType(V value, T type){
return (T) value;
}
然后,对t
的强制转换变成了对map
下限的强制转换,显然integer
不是这样,您将得到预期的类强制转换异常。
Object o = castToType(10,new HashMap<Integer,Integer>());
System.out.println(o.getClass());
castToType(10,new HashMap<Integer,Integer>()).getClass()
当你第一次使用这个
Object o = castToType(10,new HashMap<Integer,Integer>());
您现在静态地链接Object::GetClass
,不管实际返回的是什么,这都很好。
“未拆分”版本相当于这个
final HashMap<Integer, Integer> map = castToType(10, new HashMap<>());
System.out.println(map.getClass());
但是,当我尝试相同的示例时,通过将Integer更改为Object,代码编译得很好,输出为String 谁能帮助我理解为什么当输出来自其中有字符串的方法时,签名中有对象的方法是必需的。以及类型错误不明确的原因是什么。
问题内容: 我想知道Eclipse中的错误消息是什么意思: 构造函数Case(问题,解决方案,double,CaseSource)含糊不清 问题答案: 当您尝试实例化一个可应用于多个构造函数的类时,将存在问题。 例如: 如果用String对象调用构造函数,则有一个确定的构造函数。但是,如果实例化,则它可能适用于任何一个,因此是不明确的。 具有相似签名的方法同样适用。
问题内容: Executors.newFixedThreadPool(3).submit(() -> {doSmth();}); “模棱两可的方法调用。在ExecutorService中提交(可调用)和在ExecutorService中提交(可运行)都匹配。” 如何解决?我知道我可以使用匿名类,但我想使用Function。 问题答案: Executors.newFixedThreadPool(3)
无法找出正确的方法来使用匹配器来识别我要处理的exchange方法的重载。我正在打的电话:
问题内容: 如果在调用时没有设置信号挂起,则线程将被挂起,直到一个或多个挂起。set定义的信号在调用sigwait()时应已被阻止;否则,行为是不确定的。sigwait()对set中的信号的信号动作的影响未指定。 这真的很模棱两可,和这里有什么区别? 而其对如何进行选择的结论并不能完全清楚: 总之,当需要运行代码以响应异步信号来通知线程时,应使用sigwait()处理该信号。或者,如果实现提供信号
我应该如何编写以下Mockito匹配器,以便调用不会有歧义? 我试图在代码中模拟的实际函数调用是: