Java中的结构类型-遵守接口而不必导入它
假设我有一个简单的界面:Java中的结构类型-遵守接口而不必导入它,java,structural-typing,Java,Structural Typing,假设我有一个简单的界面: interface IGroupBy { String getGroupById(); } 假设我有一个列表: List<IGroupBy> v = List.of(); List v=List.of(); 但这意味着列表必须按名称实现该接口。 但是,如果我愿意接受任何具有返回该名称字符串的方法的对象,该怎么办 有没有一种方法可以使用泛型在Java中获得结构类型 List<T> v = List.of(); List v=List.o
interface IGroupBy {
String getGroupById();
}
假设我有一个列表:
List<IGroupBy> v = List.of();
List v=List.of();
但这意味着列表必须按名称实现该接口。
但是,如果我愿意接受任何具有返回该名称字符串的方法的对象,该怎么办
有没有一种方法可以使用泛型在Java中获得结构类型
List<T> v = List.of();
List v=List.of();
然后告诉Java编译器关于T?比如:
<T hasInterface:IGroupBy>
我想一种方法是使用泛型,如下所示:
interface IGroupBy<T> {
T getGroupById();
}
接口IGroupBy{
T getGroupById();
}
剩下的部分是方法名。但这仍然意味着您必须按名称/包引用相同的确切接口。我不确定这是否是您所要求的,但我相信您正在谈论的 基本上,假设您有以下类:
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 List=List.of(
新的TestClass(“test1”),
新的TestClass(“test2”)
);
您希望能够写出以下内容:
List<IGroupBy> interfaceList = list;
列表接口列表=列表;
java通过使用通配符支持这一点,可以这样做:
List<? extends IGroupBy> interfaceList = list;
List我不确定这是否是你想要的,但我相信你是在说什么
基本上,假设您有以下类:
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 List=List.of(
新的TestClass(“test1”),
新的TestClass(“test2”)
);
您希望能够写出以下内容:
List<IGroupBy> interfaceList = list;
列表接口列表=列表;
java通过使用通配符支持这一点,可以这样做:
List<? extends IGroupBy> interfaceList = list;
List我认为Java中最接近您想要实现的东西是lambdas和函数接口。
这是一篇很好的文章:
List calculators=new ArrayList();
计算器.add((数字)->externalCalculator.calculate(数字));
计算器。添加((数字)->数字*数字);
计算器。forEach(c->c.apply(1));
在本例中,您可以看到如何在一个列表中添加不同的逻辑,而无需任何公共接口(基本上我们有函数接口,但我认为在本例中这不是问题)
总而言之,Java并不是最好的语言。我认为Java中最接近您想要实现的东西是lambdas和函数接口。
这是一篇很好的文章:
List calculators=new ArrayList();
计算器.add((数字)->externalCalculator.calculate(数字));
计算器。添加((数字)->数字*数字);
计算器。forEach(c->c.apply(1));
在本例中,您可以看到如何在一个列表中添加不同的逻辑,而无需任何公共接口(基本上我们有函数接口,但我认为在本例中这不是问题)
总而言之,Java并不是最好的语言。继承该接口有什么问题?@VladHanzha不是一个大问题,但结构类型而不是命名类型的动机是我们不想按名称使用接口的原因在这种情况下,我建议您看看函数接口,如果我理解正确,它可以为你工作。@VladHanzha如果你能发布一个答案,那很酷-我认为这将是关于java+结构类型+功能接口的第一个答案之一。这可能会有帮助(不确定这是否是重复的):我认为在Java中,这是最接近的,继承接口的问题是什么?@VladHanzha不是一个大问题,但是结构类型而不是命名类型的动机是我们不想按名称使用接口的原因。在这种情况下,我建议您看看功能接口,如果我理解正确,它可以为你工作。@VladHanzha如果你能发布一个答案,那很酷-我认为这将是关于java+结构类型+功能接口的第一个答案之一。这可能会有帮助(不确定这是否是重复的)当前位置我想这是你在Java中能找到的最接近的答案是的,我从来没有理解过列表之间的区别我相信Jon Skeet对这个问题的解释相当好,就像对这个问题的回答一样是的,我从来没有理解列表之间的区别我相信Jon Skeet对这个问题的解释相当好这个问题