【问题标题】:Java Inheritance and generics, how to declare a function that applies to "multiple types" of inheritance?Java继承和泛型,如何声明适用于“多种类型”继承的函数?
【发布时间】:2012-10-19 19:20:19
【问题描述】:

我找不到合适的问题/标题来说明我想做的事情。我对泛型不是很熟悉,所以在理解它们的工作原理时有些问题。

假设我有一个将键映射到值的 Map<k,v> 类。

class Map<K,V>{
    public V get(K key){
        //...
    }

    public void set(K key, V v){
        //...
    }
 }

然后,我创建了两个子类:

class SuperMap<K,V> extends Map<K,V>{ /* ... */ }
class HyperMap<K,V> extends Map<K,V>{ /* ... */ }

我想要的是创建一个函数,它可以采用任何映射并打印每个键和值的字符串表示。所以我可以:

SuperMap<Unicorn, Horse> unicornsMap = ....;
HyperMap<Pegasus, Horse> pegasusMap = ....;

printMap(unicornsMap);
printMap(pegasusMap);

那么,printMap 函数签名应该是什么?

我尝试过:void printMap(Map&lt;Object, Horse&gt;) 但它不起作用:

MainClass 类型中的方法printMap(Map&lt;Object,Horse&gt;) 不是 适用于参数 (HyperMap&lt;Pegasus,Horse&gt;)

MainClass 类型中的方法printMap(Map&lt;Object,String&gt;) 不是 适用于参数 (SuperMap&lt;Unicorn,Horse&gt;)

【问题讨论】:

  • 你想创建一个函数来接受 any 映射(包括HashMapTreeMapMap 本身)还是只接受 HyperMap 的函数和SuperMap ?
  • 我认为void printMap(SuperMap&lt;Object, Horse&gt;) 不适用于第一个。你能检查和编辑吗?
  • @Pache,你是对的。我不记得我尝试过的中间解决方案似乎适用于其中一种但不适用于另一种。已编辑。

标签: java generics inheritance


【解决方案1】:
printMap(Map<?, Horse>)

或者,交替

<K> printMap(Map<K, Horse>)

【讨论】:

猜你喜欢
  • 2021-10-11
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多