将对象列表强制转换为超类型列表

Pet*_* B. 1 java generics casting

我有以下类结构:

public interface RangeData {
   public int getMaxVal();
   public int getMinVal();
}

public class IncomeRange implements RangeData {
  ....
}

//In a utilities class
public RangeData findRangeData(List<RangeData> list, int value) {
  ....code....
}
Run Code Online (Sandbox Code Playgroud)

当我有一个收入范围列表时,问题就出现了,但我无法转换为RangeData列表.如果这是一个单项,那就没问题了.

List<IncomeRanges> incomes = xxx();  //returns the proper data.

//Yet this does not work.
findRangeData(incomes,55);
Run Code Online (Sandbox Code Playgroud)

我试图对它进行各种演员表,但似乎没有任何效果.我怎样才能让它发挥作用?

And*_*ira 10

Java泛型是不变的.这意味着,给定两个具体的类,A并且B,与SomeClass<A>它没有关系SomeClass<B>,即使它B是一个子类型A.

所以,List<RangeData>不是超类型List<IncomeRanges>.相反,您应该使用上限有界通配符,如下所示:

public RangeData findRangeData(List<? extends RangeData> list, int value) {
    ....code....
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看有关泛型,继承和子类型的文档.