我有一个转换失败:
(Map<String, ? extends ISeries<Date, Double, ISeriesPoint<Date, Double>>>) inputSeries
我得到错误:
incompatible types: java.util.Map<java.lang.String,com.quantcomponents.marketdata.IOHLCTimeSeries>
cannot be converted to java.util.Map<java.lang.String,? extends
com.quantcomponents.core.model.ISeries<java.util.Date,java.lang.Double,
com.quantcomponents.core.model.ISeriesPoint<java.util.Date,java.lang.Double>>>
inputSeries定义为:
Map<String, IOHLCTimeSeries> inputSeries = createInputSeriesFromStockDatabases(inputStockDatabases);
createInputSeriesFromStockDatabases返回一个Map<String, IOHLCTimeSeries>
以下是接口定义:
public interface ISeries<A extends Comparable<A>, O extends Comparable<O>, P extends ISeriesPoint<A, O>> extends Iterable<P>, IPersistentIdentifiable { ... }
public interface ITimeSeries<P extends ISeriesPoint<Date, Double>> extends ISeries<Date, Double, P> { ... }
public interface IOHLCTimeSeries extends ITimeSeries<IOHLCPoint>, IStockDataCollection {...}
虽然我找不到错误,但转换似乎遵循了接口泛型。有人能发现吗?
感谢
问题是它在Map
内部。
更容易看到List
发生了什么,因为它只需要一个类型参数。String
是Object
的子类,因此String
可以被转换为Object
。您可能认为这意味着List<String>
可以转换为List<Object>
,但它不能:类型系统无法"看到"外部类型内部。
同样的事情也发生了。仅仅因为T
可以被转换为V
并不意味着Map<String,T>
可以被转换成Map<String,V>
。
(这非常烦人:例如,这意味着你不能将ArrayList<ArrayList<T>>
视为List<List<T>>
。)