【问题标题】:How to define bound type parameters in Java inner class如何在 Java 内部类中定义绑定类型参数
【发布时间】:2013-12-08 01:26:47
【问题描述】:
public class TowerOfHanoi<E> {
    private class Disk<T extends Comparable<E>> {
    }

    private class Peg<S extends Disk<T extends Comparable<E>>> extends Stack<Disk<T extends Comparable<E>>> {
    }
}

使用上面的代码,我得到以下编译错误。

令牌“扩展”的语法错误,预期

但是,如果我将 Peg 的定义更改如下,它会起作用:

private class Peg<T extends Disk<? extends Comparable<E>>> extends Stack<Disk<? extends Comparable<E>>> {
}

我不想使用通配符。有没有办法将其更改为命名参数?

【问题讨论】:

    标签: java generics inner-classes bounded-types


    【解决方案1】:

    你不能使用这样的泛型。只需将类型(不是绑定)传递给扩展类型。

    这样编译:

    public class TowerOfHanoi<E> {
        private class Disk<T extends Comparable<E>> {
        }
    
        private class Peg<T extends Disk<Comparable<E>>> extends Stack<Disk<Comparable<E>>> {
        }
    }
    

    【讨论】:

    • 我的理解是 Disk 只会接受 Comparable 而不是它的任何子类。查看我的编辑。
    • 没有。它将接受任何扩展Comparable&lt;E&gt; 的类。 Disk 实现必须定义为Disk&lt;Comparable&lt;E&gt;&gt;,但您可以使用Comparable&lt;E&gt; 的任何子类
    • 我最终使 Disk 成为非泛型类型。最后,这比实际算法占用了更多时间,所以看起来我让它变得不必要地复杂了。不过我会接受你的回答。
    【解决方案2】:

    有什么理由不能让E 具有可比性?

    public class TowerOfHanoi<E extends Comparable<? super E>>
    {
        private class Disk implements Comparable<Disk> { }
    
        private class Peg extends Stack<Disk> { }
    }
    

    【讨论】:

    • 我想过这个,但它似乎不是正确的做法。磁盘需要相互比较,所以我觉得只有 Disk 类应该对类型施加限制,而不是外部类 TowerOfHanoi。如果您发现反对的论点,请告诉我。
    • 如果TowerOfHanoi&lt;E&gt; 将创建Disk&lt;E&gt; 的实例,那么E 需要具有可比性。
    • 不正确;使用上述@Bohemian 的解决方案,它可以在不使 E 具有可比性的情况下工作。正如我在上面的评论中提到的那样,我最终还是清理了它。
    • @AbhijitSarkar,我说的正确的。这是demo
    • 那是因为你声明了 Disk;如果将 Disk 替换为 Disk>,它会编译得很好。
    猜你喜欢
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多