Imagine I have 3 rules : Rule<A>
, Rule<B>
, Rule<C>
Same I have 3 datasources : Datasource<A>
, Datasource<B>
, Datasource<C>
If I have a list of rules : List<Rule<?>>
and I do a stream : ruleList.stream().map(rule -> ...)
In the lambda function, I would like to call the datasource with same generic type than rule. For example :
ruleList.stream().map(rule -> {
Class<T> ruleType = ... // Class<A>, Class<B> or Class<C>
Datasource<T> datasource = datasourceResolver.resolve(ruleType); // Datasource<A>, Datasource<B> or Datasource<C>
return datasource.doSomething();
})
What would be the code to retrieve the ruleType
and the code of datasourceResolver
?
CodePudding user response:
Because of type erasure you'll need to take Rule and DataSource together (not logical) or:
class Rule<T> {
public final Class<T> type;
protected Rule(Class<T> type) {
this.type = type;
}
}
private Map<Class<?>, DataSource<?>> dataSourcesByType = New HashMap<>();
Now you can register DataSources by type
Class<?> ruleType = rule.type;
DataSource<?> ds = dataSourcesByType.get(ruleType);
You'll notice <?>
, especially that ds
cannot be more specific.
That could hint at alternative method overrides for cases A, B, C. A more type safe Map getter
public <X> DataSource<X> get(Class<X> type)