我無法找到一種方式,似乎並沒有錯的方式來做到這一點,下面給出如何將實現器在一個接口上轉換爲另一個接口?
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