gpt4 book ai didi

java - 在 Java 中表达匿名交集类型

转载 作者:行者123 更新时间:2023-12-01 14:32:51 27 4
gpt4 key购买 nike

这些都编译不过……我想表达匿名 intersection types in Java这样 (A & B)表示实现/扩展 A 和 B 接口(interface)的任何类型,但通过使用类似 & 的语法组合类型在代码中匿名表达.特别是我想在以下情况下使用它们:

  1. 方法参数 例如public void foo((A & B) x) { ... }
  2. 方法返回类型 例如public (A & B) foo() { ... }
  3. 局部变量 例如(A & B) foo = ...
  4. 通配符泛型 例如List<? extends A & B)> foo = ...

我认为目前(Java 13)的选项如下是否正确?

  1. 方法参数 - 使用泛型:public static <T extends A & B> void foo(T x) { ... }
  2. 方法返回类型 - 使用泛型:public static <T extends A & B> T foo() { ... }
  3. 局部变量 - 使用 var var foo = (A & B) bar
  4. 通配符泛型 - 没有当前选项

以下文章深入探讨了这些类型何时/为何有用。这article很好地涵盖了 1. 这 article涵盖 1. 2. 和 3. 这 SO question涵盖 4. 以及 Java 没有这方面的语法是多么奇怪。

--- 根据要求编辑以解释我的用例---

我经常使用仅包含信息项的值对象。这些信息项相对独立地可重用,但通常只是为了方便而组合在一起,并传递给其他应用实际逻辑的类。我发现以一种稳定且可长期重用的方式命名 getter 接口(interface)非常容易。关于什么 getCustomerForename() 的争论很少和 getCustomerId()将返回,并且定义这些接近于为您的业务定义“数据模型”。但是,一旦您尝试将它们连接在一起,就可以说是 Customer接口(interface),该接口(interface)通常变得非常特殊,并且不恰本地重用,因为在某些情况下您需要所有客户信息,而在其他情况下您只需要一些,或者与其他数据混合在一起。很难命名,是否需要创建耦合' 是任何并创建额外的代码。相反,我想避免创建/命名任何新接口(interface),而是使用 匿名交集类型 从现有类型中即时创建一个新类型,这些类型一次只公开一个 getter。所以接口(interface) AB在上面将是如下接口(interface):

interface CustomerId {
Long getCustomerId();
}

interface CustomerForename {
String getCustomerForename();
}

... 如果我有一份报告刚刚显示了这 2 个项目,我将只创建具有“类型”(CustomerId & CustomerForename) 的对象。而不是命名和创建 CustomerIdAndCustomerForename接口(interface)/类几乎没有好处。

最佳答案

如果您将类型参数指定为 <T extends A&B>您可以在通配符类型中使用它,如以下示例中使用 Optional<? extends T> 所做的那样.这很相似,但我想与您想要做的不一样,尽管现在我的大脑太痛了,无法解释有什么不同。


public class GenericsTest {

public static void main(String[] args) {

System.out.println(generateCombination().get().getB());
System.out.println(generateCombination().get().getA());
}

static <T extends A&B> Optional<? extends T> generateCombination() {
return (Optional<? extends T>) Optional.of(new Both());
}

interface A {
String getA();
}

interface B {
Number getB();
}

static class Both implements A, B {
@Override
public String getA() {
return "Hello";
}

@Override
public Number getB() {
return 23;
}
}
}

无论如何,如您的问题所述,其他变体似乎是正确的。

关于java - 在 Java 中表达匿名交集类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60148411/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com