Java多级泛型类转换

时间:2014-10-30 15:59:02

标签: java generics casting

我有一个失败的演员:

(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 {...}

演员似乎遵循界面泛型,但我无法找到错误。任何人都可以检测到它吗?

由于

1 个答案:

答案 0 :(得分:0)

问题是它在Map内。

更容易看到List发生了什么,因为它只需要一个类型参数。 StringObject的子类,因此String可以投射为Object。您可能希望这意味着List<String>可以转换为List<Object>,但它不能:类型系统无法“看到”外部类型。

你有同样的事情发生。仅仅因为T可以投放为V并不意味着Map<String,T>可以投放为Map<String,V>

(这令人非常恼火:例如,这意味着您无法将ArrayList<ArrayList<T>>视为List<List<T>>。)