繁体   English   中英

java 转换泛型类型,没有未经检查的转换警告

[英]java cast generic type without unchecked cast warning

我试图了解如何使用在 java 库中定义的Function<T,R>接口。 为什么将DoubleIt的实例传递给map有效,但传递构造函数引用会得到下面的编译器错误,有没有办法做到这一点:

编译器错误

import java.util.Arrays;
import java.util.function.Function;
import java.util.stream.Stream;

public class C {
    public static void main(String[] args) {
        final Stream<Integer> stream = Arrays.stream(new Integer[]{2, Integer.MAX_VALUE});

        DoubleIt<Integer, Long> doubleIt = new DoubleIt<>(); 
        stream.map(doubleIt)                     // OK      instance
                .forEach(System.out::println);

        stream.map(DoubleIt<Integer, Long>::new) // error   constructor reference
                .forEach(System.out::println);
    }
}

class DoubleIt<T extends Integer, R extends Long> implements Function<T, R> {

    @Override
    public R apply(T t) {
        @SuppressWarnings("unchecked")
        final R r = (R) Long.valueOf(t.intValue() * 2L);
        return r;
    }
}

第一个传递一个DoubleIt实例,另一个传递一个构造DoubleIt实例的方法,两者的签名非常不同。 为什么您希望它们可以互换?

第一个可以消耗Integer并返回Long ,第二个可以不消耗任何内容并返回DoubleIt 他们做的事情非常不同,因此你不能用一个来代替另一个。

暂无
暂无

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

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