我有一个失败的演员:
(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 {...}
演员似乎遵循界面泛型,但我无法找到错误。任何人都可以检测到它吗?
由于
答案 0 :(得分:0)
问题是它在Map
内。
更容易看到List
发生了什么,因为它只需要一个类型参数。 String
是Object
的子类,因此String
可以投射为Object
。您可能希望这意味着List<String>
可以转换为List<Object>
,但它不能:类型系统无法“看到”外部类型。
你有同样的事情发生。仅仅因为T
可以投放为V
并不意味着Map<String,T>
可以投放为Map<String,V>
。
(这令人非常恼火:例如,这意味着您无法将ArrayList<ArrayList<T>>
视为List<List<T>>
。)