在元函数中有区别吗?

发布于 2022-09-12 02:54:45 字数 536 浏览 16 评论 0

我知道什么是List<? extends Number>, 但是下面<? extends U>可以写成<U>吗?

Java SE 8 Optional 源码:

public final class Optional<T> {

    private final T value;

    public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent())
            return empty();
        else {
            return Optional.ofNullable(mapper.apply(value));
        }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

岁月无声 2022-09-19 02:54:45

可以搜索 泛型的协变和逆变(感谢题主的问题,让我又复习了一下这里…)

不用通配符直接写死的话会造成一些不便,以Optional<String>为例,对于<R> R map(Function<? super T, ? extend R)这个方法:

  1. ? super T写死成T,这里就只能传Function<String, X>不能传Function<Object, X>,即使Function<Object, X>可以用String做参数
  2. ? extend R写死成R,这里传一个Function<X, String>,那么就只能用Optaional<String>来接,不能用Optional<Object>接,因为类型不匹配

附上一段demo:

import java.util.function.Function;

public class Sf_1010000022734554 {

    /**
     * 假装自己是一个Optional
     */
    private static class Op<T> {

        private final T t;

        private Op(T t) {
            this.t = t;
        }

        public static <R> Op<R> of(R r) {
            return new Op<>(r);
        }

        /**
         * 没有通配符的map1
         */
        public <R> Op<R> map1(Function<T, R> function) {
            return new Op<>(function.apply(t));
        }

        /**
         * 有通配符的map2
         */
        public <R> Op<R> map2(Function<? super T, ? extends R> function) {
            return new Op<>(function.apply(t));
        }
    }

    public static void main(String[] args) {

        // T = String
        Op<String> op = Op.of("x");

        Function<Object, String> function1 = Object::toString;

        // 这里会报错,因为 Object != String
        // Op<R> op1 = op.map1(function1);

        // 这里没问题,因为 Object super String
        Op<String> op1 = op.map2(function1);

        Function<String, String> function2 = s -> s;

        // 这里报错,因为 Object != String
        // Op<Object> objectOp = op.map1(function2);

        // 这里可以,因为 String extends Object
        Op<Object> op2 = op.map2(function2);
    }
}
于我来说 2022-09-19 02:54:45

这种写法具有更强的目的性和扩展性, 如果此泛型对此此类来说是消费者 可以用 ? extends T,如果是生产者,可以用 ? super T,原因是泛型也不能百分之百确定就是某个class,如果确定一定以及肯定,那么就可以直接用 T

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文