Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中,是否可以将方法调用转发给更专门的方法签名?_Java_Inheritance_Introspection - Fatal编程技术网

在java中,是否可以将方法调用转发给更专门的方法签名?

在java中,是否可以将方法调用转发给更专门的方法签名?,java,inheritance,introspection,Java,Inheritance,Introspection,我在这一次的标题上经历了一段艰难的时光。这个例子最能说明问题 鉴于以下情况: 接口请求{} 接口响应{} 接口能力{ 响应执行(请求r) } 接口功能扩展了功能{ 类FooCapabilityRequest实现请求; 类FooCapabilityResponse实现响应; } 类执行者实现了FooCapability{ public FooCapability.FooCapabilityResponse执行(FooCapability.FooCapabilityRequest r){…} 公共响

我在这一次的标题上经历了一段艰难的时光。这个例子最能说明问题

鉴于以下情况:

接口请求{}
接口响应{}
接口能力{
响应执行(请求r)
}
接口功能扩展了功能{
类FooCapabilityRequest实现请求;
类FooCapabilityResponse实现响应;
}
类执行者实现了FooCapability{
public FooCapability.FooCapabilityResponse执行(FooCapability.FooCapabilityRequest r){…}
公共响应执行(请求r){
//检测r的实现类并
//使用更专门的
//上面签名
}
}
//我们的想法是能够做到:
执行者p=新执行者();
//(…使用请求接口作为类型…)
请求=新的FooCapability.FooCapabilityRequest();
//这应该调用泛型perform(),
//然后被转发到更专门的实现
p、 执行(请求);
你会怎么做呢?

这里的答案是泛型(90%)。由于
Class
现在是泛型的,因此我们可以以一种保证我们能够使用其中一种“类型”调用接口的方式公开预期的请求类型

如果需要,还可以将结果类型关联到此处,这是读者的练习。

此处的答案是泛型(90%)。由于
Class
现在是泛型的,因此我们可以以一种保证我们能够使用其中一种“类型”调用接口的方式公开预期的请求类型


如果需要,还可以在此处关联结果类型,这是读者的练习。

Okay@azurefrog,我为您更新了它。现在要详细得多。:)是的,这是可能的,但它是一种反模式,几乎可以肯定比您需要的更复杂。您是否试图根据所使用的请求类型自动分派?@chrylis是的。对于这种设置,这并不是真的必要,因为执行者可以只接受具体的实现并做正确的事情。主要是好奇。好的@azurefrog,我为你更新了它。现在要详细得多。:)是的,这是可能的,但它是一种反模式,几乎可以肯定比您需要的更复杂。您是否试图根据所使用的请求类型自动分派?@chrylis是的。对于这种设置,这并不是真的必要,因为执行者可以只接受具体的实现并做正确的事情。主要是好奇,俏皮。谢谢。请注意,使用此模式,“执行者”无法从多个功能接口继承,因此我们无法使用类型检查来查看执行者是否具有功能。不完全如此,但在本例中,我强烈建议您将Spring
ConversionService
作为一个可靠的真实示例进行检查。非常好。谢谢。请注意,使用此模式,“执行者”无法从多个功能接口继承,因此我们无法使用类型检查来查看执行者是否具有功能。不完全如此,但在本例中,我强烈建议您将Spring
ConversionService
作为一个可靠的实际示例进行检查。
interface Capability<R, S> {
  S perform(R request);

  Class<R> requestType();
  // resultType too if you want
}
Map<Class<?>, Capability<?, ?>> capabilities = collectionOfCapabilities.stream()
    .collect(toMap(Capability::requestType, identity()));
@SuppressWarnings("unsafe") // safe because we keyed the map based on the request type
private <R> Capability<R, ?> findCapability(Class<R> requestType) {
  return (Capability<R, ?>) capabilities.get(requestType);
}