Java集合 - 对元素的多态访问 [英] Java collections -- polymorphic access to elements

查看:129
本文介绍了Java集合 - 对元素的多态访问的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有 ThisType LinkedHashSet 值。
ThisType 正在实现 ThatType 界面。



我需要这个集合的多态使用 - 能够指向 LinkedHashSet< ThatType>。



这是怎么做的?



我知道这是一个天真的问题,但我尝试的几件事情没有工作,我想做正确的方式。



提前感谢。



// ==========================



UPDATE:更多详情:



在下面的代码中, ThisType - ThatType 是一个界面。

  // LinkedHashMap< Integer,? extends ThatType> theMap = new LinkedHashMap<>(); 
LinkedHashMap< Integer,ThisType> theMap = new LinkedHashMap<>();
for(Integer key:intArray){
ThisType a = new ThisType();
if(theMap.containsKey(key)){
a = theMap.get(key);
a.doStuff();
} else {
a.doOtherStuff();
}
theMap.put(key,a);
}



最后,我要返回 theMap 作为 ThatType **,而不是** ThisType 的集合。



这是链断开的地方。使用注释行(第一行)声明是在 put()& get()方法的哈希。



不确定这是否重要 - 但是,
我将返回结果 LinkedHashSet< ThatType> 。我正在从 LinkedHashMap LinkedHashSet 的转换。然而,对地图或集合中的集合值的多态引用没有任何作用。目前为止,所有这些操作中使用的所有且唯一的类型是 ThisType

解决方案

我认为你想要的是以使用通配符。

  LinkedHashSet< ;? extends ThatType> someFunction(LinkedHashSet< ;? extends ThatType> set){
return set;
}

如其他地方所述 LinkedHashSet< ThisType> / code>不是 LinkedHashSet< ThatType> 的子类,因为 LinkedHashSet< ThisType> 接受对象。

LinkedHashSet中的通配符<扩展ThatType> 意味着 ThatType 的一些类(不确定是什么)的 LinkedHastSet



虽然您可能需要考虑使用:

  ;? extends ThatType> someFunction(Set< ;? extends ThatType> set){
return set;
}


I have a LinkedHashSet of values of ThisType. ThisType is implementing the interface ThatType.

I need the polymorphic use of this collection-- be able to point to it as LinkedHashSet< ThatType >.

How is this done?

i know this is a naive question, but several things i tried didn't work, and i wanna do it the right way.

Thanks in advance.

//==============================

UPDATE: more details:

In the following code, ThisType implements ThatType-- ThatType is an interface.

//LinkedHashMap<Integer, ? extends ThatType> theMap = new LinkedHashMap<>();
LinkedHashMap<Integer, ThisType> theMap = new LinkedHashMap<>();
for (Integer key:intArray)  {
    ThisType a = new ThisType();
    if (theMap.containsKey(key))  {
        a = theMap.get(key);    
        a.doStuff();
    } else {
        a.doOtherStuff();
    }
    theMap.put(key, a);
}

In the end, i wanna return the theMap as a collection of ThatType **, not **ThisType.

this is where the chain is broken. using the commented line (first line) for declaration is giving type mismatch error on put() & get() methods of the hash.

not sure whether this is significant-- but, i'm returning the result as LinkedHashSet< ThatType >. i'm doing the conversion from LinkedHashMap to LinkedHashSet. However, nothing worked nowhere for the polymorphic reference to collection values in the map or set. All and only type i used in all these operations so far is ThisType. ThatType gave me some error just about anywhere i tried it.

解决方案

I think what you want is to use wildcards.

 LinkedHashSet<? extends ThatType> someFunction(LinkedHashSet<? extends ThatType> set) {
      return set;
 }

As has been explained elsewhere LinkedHashSet<ThisType> is not a subclass of LinkedHashSet<ThatType>, since LinkedHashSet<ThisType> can't accept ThatType objects.

The wildcard in LinkedHashSet<? extends ThatType> means a LinkedHastSet of some class (not sure what) that extends ThatType.

Though you may want to consider using this:

 Set<? extends ThatType> someFunction(Set<? extends ThatType> set) {
      return set;
 }

这篇关于Java集合 - 对元素的多态访问的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆