如何解决与Java通配符混淆
我是Java泛型的新手,我很困惑。
我写了这段代码,但出现错误“必填类型: 捕获?扩展Number,提供:Integer”。
出了什么问题?
Serilog.Sinks.File
解决方法
主要问题是函数列表的定义
private List<Function<? extends Number,? extends Number>> functions;
我会尝试使用您的案例:
private List<Function<Number,? extends Number>> functions;
然后稍微修改其他功能...
Function<Number,Integer> hundredTimes = new Function<Number,Integer>() {
@Override
public Integer apply(Number integer) {
return integer.intValue() * 100;
}
};
functions.add(hundredTimes);
Function<Number,Double> tenTimes = new Function<Number,Double>() {
@Override
public Double apply(Number o) {
return 10.0 * o.doubleValue();
}
};
functions.add(tenTimes);
System.out.println(functions.get(0).apply(Integer.valueOf(10)));
使用lambda,您终于可以编写:
functions.add( n -> n.intValue() * 100);
functions.add(n -> 10.0 * n.doubleValue());
System.out.println(functions.get(0).apply(10));
问题在于通配符的含义不同于您最初想到的含义。使用通配符意味着您使用特定类型,但是您不知道它。当您想将10作为一个整数添加时,该函数会要求输入特定类型为?。所以这行不通。也许在方法或类上使用泛型也可以根据用例解决您的问题。但是更改为Number应该可以解决问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。