Java继承和泛型,如何声明一个适用于"多种类型"继承的函数?

Jua*_*hin 3 java generics inheritance

我找不到一个好的问题/标题我想做什么.我对泛型不是很熟悉,所以我有一些问题需要了解它们是如何工作的.

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

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

    public void set(K key, V v){
        //...
    }
 }
Run Code Online (Sandbox Code Playgroud)

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

class SuperMap<K,V> extends Map<K,V>{ /* ... */ }
class HyperMap<K,V> extends Map<K,V>{ /* ... */ }
Run Code Online (Sandbox Code Playgroud)

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

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

printMap(unicornsMap);
printMap(pegasusMap);
Run Code Online (Sandbox Code Playgroud)

那么,printMap功能签名应该是什么?

我试过:void printMap(Map<Object, Horse>)但它不起作用:

printMap(Map<Object,Horse>)MainClass类型中的方法不适用于参数(HyperMap<Pegasus,Horse>)

printMap(Map<Object,String>)MainClass类型中的方法不适用于参数(SuperMap<Unicorn,Horse>)

Lou*_*man 5

printMap(Map<?, Horse>)
Run Code Online (Sandbox Code Playgroud)

或者,或者

<K> printMap(Map<K, Horse>)
Run Code Online (Sandbox Code Playgroud)

  • 如果它是一个`Map <Object,Horse>`,那么你可以做`map.put("foo",Horse)`.但你不能用"Map <Pegasus,Horse>"这样做,因为`String`不是"Pegasus".换句话说,`Map <Object,Horse>`支持"Map <Pegasus,Horse>"从根本上不支持的操作,所以让你将`Map <Pegasus,Horse>`转换为`Map <是错误的.对象,马>`. (4认同)
  • 因为Java中的泛型不是协变的. (2认同)