加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java通用转换,非直接

发布时间:2020-12-15 04:56:39 所属栏目:Java 来源:网络整理
导读:我发现 Java中的演员有些奇怪,我之前从未见过. 在通用方法中编程时,实际上没有完成转换. 测试奇怪的事情. 在HashMap上: HashMapString,Object map = ...map.put("hello","World");System.err.println((Integer)map.get("hello")); // ----- ClassCastExcept
我发现 Java中的演员有些奇怪,我之前从未见过.
在通用方法中编程时,实际上没有完成转换.

测试奇怪的事情.

在HashMap上:

HashMap<String,Object> map = ...
map.put("hello","World");
System.err.println((Integer)map.get("hello")); //  -----> ClassCastException

在地图上包装

MapWrap wrap = ...
wrap.put("hello","World");
System.err.println(wrap.get("hello",Integer.class)); // -----> don't cast,print World (i guess because println receives an Object reference but the cast should be done before that).
System.err.println(wrap.get("hello",Integer.class).toString()); // -----> print World + ClassCastException

方法代码:

private <T> T get(String key,Class<T> c){
    return (T)map.get(key);
}

private Object get(String key){
    return map.get(key);
}

有人知道mechansim是否有名字或知道它的一些东西?

谢谢

解决方法

演员:

(T) map.get(key);

由于类型擦除,根本不做任何事情. MapWrap.get()方法将被删除为:

private Object get(String key,Class<T> c){
    return map.get(key);
}

这将永远有效.只有在将此方法的结果赋给的地方才会插入到Integer的强制转换,并且因为在第一个MapWrap示例中,您将它传递给需要Object参数的方法,所以这不会发生.

在第二种情况下,您尝试调用Integer.toString()方法,因此插入到Integer的转换会失败.

你已经传入了类对象,执行“泛型转换”的正确方法是这样的:

private <T> T get(String key,Class<T> c){
    return c.cast(map.get(key));
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读