当前位置: 首页 > 知识库问答 >
问题:

铸造中的模棱两可行为

闻华容
2023-03-14

我有一节简单的课

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)

共有1个答案

祁嘉瑞
2023-03-14

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匹配器,以便调用不会有歧义? 我试图在代码中模拟的实际函数调用是: