以下を考えると、間違っていないように見える方法でこれを行う方法を見つけるのに苦労しています
public interface IType {}
public interface IMode {}
public interface Factory<T extends IType> {
IMode get(T o);
Class<T> getIType();
}
上記のインターフェースと、対応するファクトリーの両方IType
を実装するクラスの大きなリストがあります。IMode
たとえば、あるものから別のものに変換できる必要があります。
public class A implements IType {}
public class One implements IMode {}
public class AToOne implements Factory<A> {
public IMode get(A o){
return new One();
}
public Class<A> getIType(){
return A.class;
}
}
これらのクラスの 1 対 1 のマッピングがある場合、つまり、すべての具象に対して、対応するファクトリを持つIType
具象が 1 つだけ存在する場合、 s のリストを s のリストに変換するにはどうすればよいでしょうか?IMode
IType
IMode
すなわち。
private List<Factory<? extends IType>> factoryList;
public List<IMode> getConversions(List<? extends IType> types){
???
}
初めての試みはうまくいかなかったので、
//Fill this using the getIType() method from each factory
Map<Class<IType>, Factory<? extends IType>> factoryList = new HashMap<Class<IType>, Factory<? extends IType>>();
public List<IMode> getConversions(List<IType> types){
List<IMode> modes = new ArrayList<IMode>();
for(IType type : types){
//Derp
Factory<? extends IType> factory = factoryList.get(type.getClass());
//Error
factory.get(factory.getIType().cast(type));
}
}
エラー:
The method get(capture#12-of ? extends IType) in the type
Factory<capture#12-of ? extends IType>
is not applicable for the arguments (capture#14-of ? extends IType)