我无法找到一种方式,似乎并没有错的方式来做到这一点,下面给出如何将实现器在一个接口上转换为另一个接口?
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
有一个并且只有一个具体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)
到底什么是你的问题?您的方法背后的一般想法对我来说似乎很好。 – Voo
@Voo在上面的概述中,'type.getClass()'返回的是与我放入地图中不匹配的具体类,然后我不知道如何将输入投射到工厂,确实得到了,因为不能保证它们是相同的。我写的东西没有编译。 – Andrew
啊所以你的问题不是一般的设计方法,而是泛型部分。这应该很容易修复,让我试试:) – Voo