【发布时间】:2021-07-19 10:53:35
【问题描述】:
我想构建一个接口,其中包含一个方法,该方法可以接受可变数量的各种类型的参数,如下所示:
interface MyInterface {
boolean myMethod(Object ...args); <--HERE I WOULD LIKE TO PASS ANY NUMBER OF PARMS OF ANY TYPE
}
在接口的具体实现中,我想传递任意数量的任意类型的参数如下:
class MyImpl1 implements MyInterface {
boolean myMethod(Student s, Course d) {
...
}
}
另一种实现方式如下:
class MyImpl2 implements MyInterface {
boolean myMethod(Department d) {
...
}
}
在这方面,我在这里浏览了一些帖子,但对如何执行此操作一无所知。有人可以帮忙吗?谢谢。
编辑:
我想到了确切的接口结构如下:
interface ConditionEvaluator {
boolean evaluate(Object ...args);
CondtionName getConditionName();
}
一个具体的实现如下所示:
class StudentEvaluator implements MyInterface {
boolean evaluate(Student s, List<Course> courses) {
...
}
ConditionType getConditionType() {
return ConditionType.STUDENT_PASSED;
}
}
要使用它,我想,我将创建一个枚举映射,其中包含 ConditionType 作为键和具体实现作为值,如下所示:
Map<ConditionType, MyInterface> conditionTypeMap;
然后从调用者方法开始,正在考虑基于适当的ConditionType 派生适当的实现。
用法有点像下面,
我将有一个工厂类如下:
@Component
public class ConditionEvaluatorFactory {
private final Map<ConditionType, ConditionEvaluator> conditionEvaluatorMap;
public ConditionEvaluatorFactory(List<ConditionEvaluator>
conditionEvaluatorList) {
Map<ConditionTyope, ConditionEvaluator> evaluatorMap =
new EnumMap<>(ConditionEvaluator.class);
for (ConditionEvaluator evaluator :
conditionEvaluatorList) {
evaluatorMap.put(evaluator.getConditionType(),
evaluator);
}
this.conditionEvaluatorMap = evaluatorMap;
}
public ConditionEvaluator getEvaluator(ConditionType conditionType) {
ConditionEvaluator evaluator = conditionEvaluatorMap
.get(conditionType);
if (evaluator == null) {
throw new Exception("error message");
}
return evaluator;
}
}
调用者类如下:
@component
class StudentUtil {
@Autowired
private ConditionEvaluatorFactory evaluatorFactory;
public void callerFunc(Student s, List<Course> courseList) {
boolean flag = evaluatorFactory.getEvaluator(ConditionType.STUDENT_PASSED).evaluate(s, courseList);
...
}
【问题讨论】:
-
你能解释一下拥有接口的意义吗?也就是说,您是否将拥有引用
MyInterface类型对象并在其上调用myMethod的代码? -
恐怕这在 Java 中是不可能的。但是,您对这种模式的实际用法是什么?那个界面在这里似乎没有太大的用途。
-
如果参数没有在接口中定义并且可以是任意的,那么任何调用代码如何能够使用
MyInterface的实例。 -
@sp00m,实际上,我希望有一个通用接口,该接口将有一个单一方法采用不同的参数并将它们评估为真/假。在我的应用程序中,有一些用例可以评估这些条件。这就是为什么我想有一个通用的接口并相应地提供具体的实现。现在,正如您所说,这是不可能的,我不明白,这样做的最佳方法是什么。
-
“实际上,我希望有一个通用接口,它有一个采用不同参数的单一方法” - 你可以有一个通用接口或采用完全不同参数的方法。两者一起根本没有意义 - 如果方法具有完全不同的参数,它们不能共享一个公共接口,它们根本不符合单个接口,即使在字面解释中,不管 java。