加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

具有无意义类型通配符的方法的Java API类

发布时间:2020-12-15 04:40:15 所属栏目:Java 来源:网络整理
导读:在 Java 8中,类java.util.Optional( javadoc)类提供 “Maybe” Monad或 Option Type的功能. 更直接: public final class java.util.OptionalT extends Object A container object which may or may not contain a non-null value. If a value is present,is
在 Java 8中,类java.util.Optional( javadoc)类提供 “Maybe” Monad或 Option Type的功能.

更直接:

public final class java.util.Optional<T> extends Object

A container object which may or may not contain a non-null value. If a
value is present,isPresent() will return true and get() will return
the value.

One of the methods是:

<U> Optional<U> map(Function<? super T,? extends U> mapper)

If a value is present,apply the provided mapping function to it,and if
the result is non-null,return an Optional describing the result.

问题是为什么map()在U类型上使用类型通配符.

我对类型通配符的理解很简单:

enter image description here

? super T指定从Object到T(包括Object和T)的子类路径给出的类集合中的某些类型联合在任何子接口路径上找到的接口集合,通过工具“作为一个侧面”拉出.

而且? extends U只是从扩展U(Uincluded)的类集合中指定一些类型.

所以可以写一下:

<U> Optional<U> map(Function<? super T,U> mapper)

没有丢失信息.

或不?

解决方法

不完全的.

功能<? super T,U>与函数<?不同超级T,?扩展U>.

例如,我仍然可以得到一个Optional< CharSequence>,即使我传递了一个函数< Object,String>方法.如果该方法被定义为< U>可选< U> map(函数<?super T,U> mapper),那么这是不可能的.

这是因为泛型是不变的:< T>和<?不一样延伸T>.这是用Java语言实现的设计决策. 让我们看看Jon Skeet explains what would happen如果泛型不是不变的:

class Animal { }

class Dog extends Animal { }

class Cat extends Animal { }
public void ouch() {
    List<Dog> dogs = Arrays.asList(new Dog(),new Dog());
    List<Animal> animals;
    // This would be legal,right? Because a list of dogs is a list of animals.
    List<Animal> animals = dogs;
    // This would be legal,right? Because a cat could be added to a
    // list of animals,because a cat is an animal.
    animals.add(new Cat());
    // Unfortunately,we have a confused cat.
}

虽然我不完全确定你在评论中的意思,但我会试着详细说明.

如果您可以完全控制您提供的函数,那么方法的签名是否为Function<? super T,U>或功能<?超级T,?扩展U>,您只需相应调整您的功能.但是该方法的作者可能希望该方法尽可能灵活,允许一个函数将其第二个参数提供为U的子类,而不仅仅是U本身.实际上你将其下限从U扩展到U的某个子类型.

So the function should really read <U> Optional<? the-most-general-but-fixed-supertype-of U> map(Function<? super T,U> mapper) but expressing it that way would be awkward.

我确实很尴尬.此外,您提出的符号与map()的实际方法签名之间存在差异,这涉及下界和上界的含义.

阅读更多:

> A picture explaining the principle “Producer Extends Consumer Super”
> What is the use of saying <? extends SomeObject> instead of <SomeObject>?
> Upper and lower bounds

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读