这些都无法编译,但是我想表达匿名Java中的交集类型, 使得(A & B)
表示实现/扩展A和B接口的任何类型,但通过使用某些语法组合类型来在代码中匿名表达。特别地,我想在以下情况下使用它们:
- 方法参数 例如
public void foo((A & B) x) { ... }
- 方法返回类型 例如
public (A & B) foo() { ... }
- 局部变量 例如
(A & B) foo = ...
- 通配符泛型 例如
List<? extends A & B)> foo = ...
我是否正确认为目前(Java 13)对我而言的选项如下?
- 方法参数 - 使用泛型:
public static <T extends A & B> void foo(T x) { ... }
- 方法返回类型 - 使用泛型:
public static <T extends A & B> T foo() { ... }
- 局部变量 - 使用 var
var foo = (A & B) bar
- 通配符泛型 - 当前没有选项
以下文章深入探讨了这些类型何时/为什么能够有用。此 文章 很好地涵盖了1. 此 文章 涵盖了1. 2. 和 3. 这个 stackoverflow问题 涵盖了4.,并介绍了 Java 没有语法来实现它的有趣情况。
---编辑以解释我的使用情况如请求所示---
我经常使用只包含信息项的值对象。这些信息项相对独立且可重复使用,但通常只是为了方便而被聚合在一起,并传递给应用实际逻辑的其他类。我发现很容易以稳定和长期可重用的方式命名getter接口。关于getCustomerForename()
和getCustomerId()
将返回什么,几乎没有争议,并且定义它们接近于为您的业务定义“数据模型”。但是,一旦您尝试将它们组合在一起,以创建一个Customer
接口,该接口通常变得非常专用,并且不适当地在某些上下文中重复使用,其中您需要所有客户信息,在其他情况下,您只需要其中几个或与其他数据混合在一起。这很难命名,会创建不必要的耦合并创建额外的代码。相反,我想避免创建/命名任何新接口,而是使用匿名交集类型从公开每次只有一个getter的现有类型中创建新类型。因此,上述接口A
和B
将是以下接口:
interface CustomerId {
Long getCustomerId();
}
interface CustomerForename {
String getCustomerForename();
}
如果我有一个报告只涉及这两项,我会创建带有“类型”
(CustomerId&CustomerForename)
的对象,而不是为了极少的好处命名和创建CustomerIdAndCustomerForename
接口/类。