繁体   English   中英

是否有一种优雅的方式来转换List <Double> 进入清单 <Number> ?

[英]Is there an elegant way to convert List<Double> into List<Number>?

我有一个函数,其参数是:

 myFn(String, List<Number>, List<Number>)

调用函数有两个List对象,我想用它作为函数的第二个和第三个参数。 我收到编译错误:

The method myFn(String, List<Number>, List<Number>) in the type MyLib is not applicable for the arguments (String, List<Double>, List<Double>)

有没有一种简单的方法来克服这个问题? 有没有一种简单的方法可以将Double列表转换为Number of List?

您不能将List<Double>转换为List<Number>因为以下代码会破坏List<Double>

List<Double> list = new List<Double>();
List<Number> list1 = list; // This does not work
list1.add(new Integer(0));
Double d = list.get(0);// Hu-hoh you received an Integer, not a Double!!
List<? extends Number> list2 = list; // This does work

你能做什么,就是改变

myFn(String, List<Number>, List<Number>)

myFn(String, List<? extends Number>, List<? extends Number>)

将myFn定义更改为<T extends Number> myFn(String, List<T>, List<T>, Class<T> type) ,您可以将其称为myFn(String, List<Double>, List<Double>, Double.class)

如果您知道该方法不会修改该列表,请使用

List<Number> unmodifiableView = Collections.unmodifiableList(doubleList);

它以恒定时间运行并返回视图。 它是完全类型安全,高效和合法的 - 只要您知道列表不会被修改。

如果你不能改变myFn方法,那么作弊是一个选择:

private <returntype> myFnAdapter(String s , List<Double> l1Double, List<Double> l2Double) {

  // the following lines do create warnings
  // it's safe, because all list items always extend Number.
  List l1TypeErased = l1Double; 
  List<Number> l1Number = l1TypeErased;

  List l2TypeErased = l2Double;
  List<Number> l2Number = l2TypeErased;

  return myFn(s, l1Number, l2Number);
}

你应该看到一些警告,就是这样。 但是我们知道我们得到了Double的列表,并且这些列表中的所有项都扩展了Number ,所以它不会在运行时引起麻烦。 只需添加注释即可解释类型擦除。 然后将所有值复制到新列表会更便宜。

您可以使用

myFn(String, List<? extends Number>, List<? extends Number>) 

或者用你的功能打电话

myFn(String, (List) list1, (List) list2); // produces a warning. 

你不能像这样投射集合。 这个Java教程为您提供了完整的解释。

作为一个解决方案,您在调用方法时只需创建一个以Double List作为参数的新List:

List<Double> doubleList = new ArrayList<Double>();

myFn(new ArrayList<Number>(doubleList));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM