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
和return一个Long
,第二个可以不消耗任何东西和return一个DoubleIt
。它们做的事情非常不同,因此您不能用一个代替另一个。
我正在尝试了解如何使用 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
和return一个Long
,第二个可以不消耗任何东西和return一个DoubleIt
。它们做的事情非常不同,因此您不能用一个代替另一个。