当前位置:  开发笔记 > 编程语言 > 正文

如何将对象添加到<?扩展Inteface>?

如何解决《如何将对象添加到<?扩展Inteface>?》经验,为你挑选了1个好方法。



1> Andy Turner..:

我如何可以将添加MyObj到这个aMap

你不能,因为键类型的上限.

原因? extends A可能是MyOtherObj implements A.在这种情况下,能够将类型的键MyObj放入地图是不安全的:

Map anotherMap = new HashMap<>();

Map aMap = anotherMap;
aMap.put(new MyObj(), "");  // Can't do this; but if you could...

MyOtherObj obj = anotherMap.keySet().iterator().next();  // ClassCastException!

记住首字母缩略词PECS(更多细节请参阅此问题):

制片人 extends

消费者 super

换句话说,Map只能用于生成实例A,它不能使用/接受实例A.

例如,您可以迭代键("生成"键):

for (A a : aMap.keySet()) { ... }

地图只能"消耗"文字null:

aMap.put(null, "");

因为null可以毫无例外地转换为任何类型.但是在只有一个键的地图中没有太多用处 - 您也可以直接存储该值.

安全地执行此类型操作的唯一方法是MyObj通过您知道接受MyObj实例的引用将实例放入地图:

Map safeMap = new HashMap<>();
safeMap.put(new MyObj(), "");

Map aMap = safeMap;

要么

Map safeMap = new HashMap<>();
safeMap.put(new MyObj(), "");

Map aMap = safeMap;

但你应该考虑根本没有通配符类型的地图; Map或者Map更容易.

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有