我可以问一个类通用所需的类型吗?

时间:2016-11-28 05:57:25

标签: java generics completable-future

我有一个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 个答案:

答案 0 :(得分:1)

最简单的方法是将CompletableMessage设为通用,指定其返回类型:

public interface CompletableMessage<T> {
...

然后继承具有以下类型的特定消息:

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

并匹配getFuture()方法的类型:

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