鉴于以下情况,我很难找到一种似乎没有错的方法来做到这一点
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;
}
}
鉴于这些类是一对一的映射,即对于每个具体IType
都有一个且只有一个IMode
具有相应工厂的具体,我将如何将 s 列表转换为IType
s 列表IMode
?
IE。
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)