繁体   English   中英

Java中乘法有界类型参数的用途是什么?

[英]What are uses for multiply bounded type parameters in Java?

在Java泛型中,可以使用“&”将多个接口指定为类型参数的类型边界。 例如,这允许我们使用通用接口来操纵不同类型的对象,以统一操纵这些接口,即使这些通用接口没有父接口也是如此。 我的问题是,如何使用? 出于什么目的? 我可以想象使用此功能进行收藏,但是与创建新界面相比,它到底有什么用呢? 这不能动态使用,也不能用于类型参数。 仅仅是语法糖,还是此功能有实际用例?

这是取自我的Java Generics书的示例:

public static <S extends Readable & Closeable, 
              T extends Appendable & Closeable> 
       void copy(S source , T target, int size){

    //code to copy from source to target 

}

上面的方法采用实现了ReadableCloseable以及实现AppendableCloseable任何目标,并从源复制到目标。 您可能想知道为什么我们不能将其简化为:

public static void copy(Reader source, Writer target, int size)

实际上,这将允许大多数相同的类,但不是全部。 例如, PrintStream实现AppendableCloseable ,但它不是Writer的子类。 此外,您不能排除某些使用您的代码的程序员可能拥有他或她自己的自定义类的可能性,例如,该类实现ReadableCloseable但不是Reader的子类。

有一些用例,但是通常有其他方法可以达到相同的结果。 这只是Java开发人员可以使用的工具箱中的另一个工具。

但是,假设你有一个JPanel ,需要一个自定义JComponent实现MyInterface 它可以是多个组件之一,具体取决于面板上选择的另一个选项。 您希望将其引用为JComponent以便可以与之交互并放置它,但是还需要将其引用为MyInterface来调用一些自定义方法。

在这种情况下,您不能简单地将所需的JComponent方法添加到MyInterface ,因为必须调用JPanel.add(component将其放在整个面板上。您不能使您的接口以某种方式扩展JComponent因为Java无法正常工作那样,您无法为JComponent创建自定义扩展,因为有时您的对象是另一个面板,有时是一个文本字段,并且您不想限制自己,因此可以将其引用为JComponent & MyInterface

我当时在想,一个有趣的用例可能是将它与多重继承(组成和委托)结合使用,尤其是与泛化集一起创建更强的约束时。 例如,在用例建模中,参与者可以是组织,系统或子系统,但同时也可以是主要,次要和三元参与者。 所有这些都可能需要不同的行为(例如,三元演员有中风,但主要演员有目标),因此它们不能崩溃。 现在要与可能是三元参与者和组织的银行合作,您将使用此功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM