这在Java中不存在,但其他基于JVM的语言可能有这样的概念(Scala具有特质,因此它们拥有联合并非不可能)。
在Java中有替代方案:
1. 使用重载。
2. 使用泛型。
3. 使用接口(可能是最接近您所寻找的内容)。
(1)使用重载:如果您需要使用一个字符串或一个数字,则创建两个方法。
void foobar(int n) { ... }
void foobar(String s) { ... }
注意其中的
int
不是
Integer
(原始类型与包装类型的区别)...
(2) 使用泛型:如果您需要该对象实现某个接口(作为方法类型参数):
Runnable run1(Runnable runnable);
<E extends Runnable> E run2(E runnable);
<E extends Runnable & InterfaceA> E run3(E runnable);
run1
和run2
基本相同:如果方法返回类型为void
,那么E
类型可能是无用的。
<E extends Runnable & InterfaceA>
很少使用,但可以限制E
,使其实现类/接口Runnable
和InterfaceA
。
(3):您可以使用接口;Java不支持多重继承,但支持默认方法和多个接口:
interface B {}
interface A extends B, C, D, E, F {...}
问题在于无法使 A 的实现继承自 B、C、...、F 的实现。虽然某些语言中称之为 trait,但 Java 并未提供此功能。您可以尝试使用委托来实现此功能:
class AImpl implements A {
private final B b;
public AImpl() {
this.b = new BImpl();
}
public void methodOfB() {b.methodOfB();}
}
这对于数字和字符串以及任何无法更改继承模型(最终类、第三方类等)的类型都不起作用。
export type Message = AudioMessage | VideoMessage | ImageMessage;
所以这些Message/AudioMessage/...都是类。而Message可以是任何这些类的对象。 - undefinedcatch (IOException | InterruptedException e)
,它在catch子句的上下文中管理联合类型。如果类的返回类型与现代的switch
模式匹配或重命名的类型转换相结合,例如if (a instanceof MyThing thing)
,那将是很好的,但似乎并不存在或正在计划中。 - undefined