在Java泛型中,您可以使用“&”将多个接口指定为类型参数的类型边界。这允许我们例如操纵具有公共接口的不同类型的对象以被均匀地操纵,即使没有用于那些常见接口的父接口。我的问题是,如何使用它?出于什么目的?我可以想象将此功能用于集合,但它是如何创建新界面的?这不能动态使用,也不能用于类型参数。它只是一个语法糖,还是有这个功能的真实用例?
答案 0 :(得分:5)
以下是我的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
}
上述方法采用实现Readable
和Closeable
的任何源以及实现Appendable
和Closeable
的任何目标以及从源到目标的副本。您可能想知道为什么我们无法将其简化为:
public static void copy(Reader source, Writer target, int size)
这确实会让大多数人承认 相同的课程,但不是全部。对于 实例,
PrintStream
实现Appendable
和Closeable
,但是 不是Writer
的子类。 此外,你不能排除 一些程序员使用的可能性 你的代码可能有他或她自己的代码 比如说实现的自定义类Readable
和Closeable
但不是Reader
的子类。
答案 1 :(得分:3)
有用例,但通常有其他方法可以达到相同的效果。这只是Java开发人员可用的工具箱中的另一个工具。
但是,假设您有一个JPanel
,它采用实现JComponent
的自定义MyInterface
。它可以是多个组件之一,具体取决于面板上选择的其他选项。您希望将其引用为JComponent
,以便您可以与其进行交互并放置它,但您还需要将其引用为MyInterface
以调用一些自定义方法。
在这种情况下,您不能简单地将所需的JComponent方法添加到MyInterface
,因为您必须调用JPanel.add(component
将其放在整个面板上。您不能以某种方式扩展JComponent
,因为Java不能像那样工作。您无法为JComponent
创建自定义扩展区,因为有时您的对象可能是另一个面板,有时它是一个文本字段,您不想限制自己。因此,您可以将其引用为JComponent & MyInterface
。
答案 2 :(得分:0)
我在想,一个有趣的用例可能会将它与多重继承(组合和委托)结合使用,特别是使用泛化集来创建更强的约束。例如,在用例建模中,参与者可能是组织,系统或子系统,但同时也是主要,次要和三元行为者。所有这些可能需要不同的行为(例如三元演员有利益,但主要有目标),所以他们不能崩溃。现在要与一家可能是三元演员和组织的银行合作,你可以使用这个功能。