代码之家  ›  专栏  ›  技术社区  ›  dan

泛型和通配符

  •  0
  • dan  · 技术社区  · 7 年前

    我正在设计一个BinarySearchTree的实现,尽管我遇到了一个以前从未遇到过的问题。我也不太了解如何解决这个问题:

    The type K is not a valid substitute for the bounded parameter <K extends Comparable<? super K>> of the type BST<K,V>
    

    这是我在创建一个名为 BST<K extends Comparable<? super K>, V> 然后有另一个类扩展这个名为 RectangleBST<K,V> . 所以 RectangleBST<K,V> extends BST<K,V> 但是当我使用 BST<K, V> .

    一种解决方案是使用extends BST<Integer, Rectangle>

    另一种可能是在矩形BST中使用可比键,尽管我相信我的计划是在BST中比较键而不是在矩形BST中比较键?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Andreas dfa    7 年前

    泛型类型参数的名称不必相同,因此为了更好地看到差异,让我们重命名它们:

    BST<A extends Comparable<? super A>, B>
    
    RectangleBST<C, D> extends BST<C, D>
    

    其工作原理与函数调用类似:

    bst(int a, int b)
    
    rectangleBst(int c, int d) {
        bst(c, d);
    }
    

    c 兼容 a . 我是说,如果 C 兼容 A .

    事实并非如此,因为 C 可以是任何类型,即使是未实现/扩展的类型 Comparable . 自从 A. 需要类型参数来实现/扩展 可比较的 不兼容。

    要使其兼容,还需要限制 C 可比较的 :

    RectangleBST<C extends Comparable<? super C>, D> extends BST<C, D>
    

    兼容 A. .


    BST<K extends Comparable<? super K>, V>
    
    RectangleBST<K extends Comparable<? super K>, V> extends BST<K, V>
    

    K 在里面 RectangleBST 不是吗 K 作为 K 在里面 BST . 这是另一种情况 映射到 K 在里面 ,与 C A. .