2016-11-28 55 views
1

我有一个CompletableFuture,其类型取决于消息返回的结果:一些消息我可以问一个课程它需要什么类型的泛型?

public <T> CompletableFuture<T> getFuture(
    CompletableMessage message) 
{ 
    .. 
} 

例子:

public class SomeMessageA implements CompletableMessage { 
    .. // Future is UUID 
} 

public class SomeMessageB implements CompletableMessage { 
    .. // Future is String 
} 

public class SomeMessageC implements CompletableMessage { 
    .. // Future is Integer 
} 

我已经可以明确指定通用:

CompletableFuture<UUID> a = getFuture(new SomeMessageA()); 
CompletableFuture<String> b = getFuture(new SomeMessageB()); 
CompletableFuture<Integer> c = getFuture(new SomeMessageC()); 

这样做的麻烦是我直到运行时才发现是否有错误。

有没有一种方法,我可以通过询问消息是否返回对象的类来获取将来的泛型类型?

我可以在C做++这样的:

class SomeMessageA { 
public: 
    typedef int future_t; 
}; 

SomeMessageA::future_t a; 

我可以做的Java类似的东西或我会永远必须引用的预期类型的​​文档?

回答

1

最简单的方法是使CompletableMessage通用也指定它的返回类型:

public interface CompletableMessage<T> { 
... 

然后继承与类型的具体信息:

public class SomeMessageA implements CompletableMessage<Uuid> { 
... 

并匹配类型getFuture()方法:

public <T> CompletableFuture<T> getFuture(CompletableMessage<T> message) { 
... 
+0

完美。非常感谢。 – Zhro

相关问题