【问题标题】:Structural typing in Java - adhering to interface without having to import itJava中的结构类型 - 坚持接口而不需要导入它
【发布时间】:2023-04-06 09:57:01
【问题描述】:

假设我有一个简单的界面:

interface IGroupBy {
  String getGroupById();
}

假设我有一个清单:

List<IGroupBy> v = List.of();

但这意味着列表必须按名称实现该接口。 但是,如果我愿意接受任何具有返回具有该名称的字符串的方法的对象呢?

有没有办法以某种方式使用泛型在 Java 中获得结构类型?

List<T> v = List.of();

然后告诉Java编译器关于T?比如:

<T hasInterface:IGroupBy>

我想有一种方法可以使用这样的泛型:

   interface IGroupBy<T> {
      T getGroupById();
   }

剩下的部分是方法名。但这仍然意味着您必须按名称/包引用相同的确切接口。

【问题讨论】:

  • 继承那个接口有什么问题?
  • @VladHanzha 不是一个大问题,但结构类型而不是主格类型的动机是我们不想按名称使用界面的原因
  • 在这种情况下,我建议你看看功能接口,如果我理解正确的话,它可以为你工作。
  • @VladHanzha 很酷,如果你能发布一个答案 - 我认为这将是 SO 谈论 java+structural typing+functional interfaces 的第一个答案之一
  • 也许这有帮助(不确定这是否可能是重复的):stackoverflow.com/questions/1079785/… 我认为它与 Java 中尽可能接近

标签: java structural-typing


【解决方案1】:

我不确定这是否是您要求的,但我相信您说的是java covariance

基本上,假设您有以下课程:

class  TestClass implements IGroupBy { 
    private String id; 
    TestClass(String id) {
        this.id = id;
    }   
    @Override
    public String getGroupById() {
        return id;
    }
}

现在,如果您有以下列表:

 List<TestClass> list = List.of(
                new TestClass("test1"),
                new TestClass("test2")
        );

你希望能够写出类似的东西:

List<IGroupBy> interfaceList = list;

这在 java 中通过使用通配符得到支持,可以这样完成:

List<? extends IGroupBy> interfaceList = list;

【讨论】:

  • 是的,我一直不明白这种情况下List&lt;? extends IGroupBy&gt; 和简单的List&lt;IGroupBy&gt; 之间的区别
  • 我相信 Jon Skeet 很好地解释了这个问题 stackoverflow.com/questions/2745265/…
【解决方案2】:

我认为 Java 中最接近您想要实现的是 lambda 和函数式接口。 这是一篇值得阅读的好文章:https://www.baeldung.com/java-8-functional-interfaces

    List<Function<Integer, Object>> calculators = new ArrayList<>();

    calculators.add((number) -> externalCalculator.calculate(number));
    calculators.add((number) -> number * number);

    calculators.forEach(c -> c.apply(1));

在这个例子中,你可以看到如何在没有任何通用接口的情况下向一个列表添加不同的逻辑(基本上我们有 Function 接口,但我认为在这种情况下这不是问题)。

总而言之,Java 并不是处理此类事情的最佳语言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多