0

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

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();
   }

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

4

2 回答 2

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;
于 2019-02-17T08:41:08.803 回答
1

我认为 Java 中最接近您想要实现的是 lambdas 和函数式接口。这是一篇很好的文章: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 并不是处理此类事情的最佳语言。

于 2019-02-17T09:49:02.647 回答