public class Test<T extends Test.Mapper<?>> {
SomeFactory<T> factory;
public Test(SomeFactory<T> factory) {
this.factory = factory;
}
public <V> V handle(T<V> request) { // fails how to get Class<V> of request.getCls() of a mapper or its subtype?
HttpUriRequest httpUriRequest = factory.get(request); // does not work
// decode response and return it as an object represented by request.getCls
return null;
}
public interface Mapper<T> {
Class<T> getCls();
}
public interface SomeMapper<T> extends Mapper<T> {
void doSomeAdditional();
}
public interface SomeFactory<T extends Test.Mapper<?>> {
HttpUriRequest get(T mapper);
}
}
handle メソッドは、http 要求を実行し、応答本文を Mapper の getCls() メソッドによって表されるオブジェクトにデコードする汎用メソッドです。SomeFactory 実装は、そのタイプにのみ固有のいくつかのメソッドにアクセスする必要があるため、このクラスで Mapper のさまざまなサブタイプを処理できるようにしたいと考えています。
これに沿った何か
SomeFactory<SomeMapper<?>> somefactory = // factory implementation
Test<SomeMapper<?>> test = new Test<SomeMapper<?>>(someFactory);
test.handle(implementation of SomeMapper<Integer>); // should return an instance of Integer
明確化: 基本的に、Test のインスタンス化は、Test の実際のタイプ (SomeMapper または Mapper) に対応する handle() タイプのみにする必要があります。handle メソッドは、この実際のタイプのリクエストを受け取ることができます。
IEだった場合Test<SomeMapper<?>> test
、次のようなリクエストがあります
ASomeMapper implements SomeMapper<Double> {}
BSomeMapper implements SomeMapper<Integer> {}
test.handle(new ASomeMapper()); // this should return Double
test.handle(new BSomeMapper()); // this shold return Integer
多分私は再設計する必要がありますか?