具有无意义类型通配符的方法的Java API类
在
Java 8中,类java.util.Optional(
javadoc)类提供
“Maybe” Monad或
Option Type的功能.
更直接:
One of the methods是:
问题是为什么map()在U类型上使用类型通配符. 我对类型通配符的理解很简单: ? super T指定从Object到T(包括Object和T)的子类路径给出的类集合中的某些类型联合在任何子接口路径上找到的接口集合,通过工具“作为一个侧面”拉出. 而且? extends U只是从扩展U(Uincluded)的类集合中指定一些类型. 所以可以写一下:
没有丢失信息. 或不? 解决方法
不完全的.
功能<? 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的某个子类型.
我确实很尴尬.此外,您提出的符号与map()的实际方法签名之间存在差异,这涉及下界和上界的含义. 阅读更多: > A picture explaining the principle “Producer Extends Consumer Super” (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java – android.support.v7.widget.GridLayout无法实例化
- java之StringBuffer常见使用方法解析
- 新玩!遇到问题:请使用@ javax.persistence.Entity注释注释
- java – 何时使用大写和何时使用小写的名称
- Redis介绍和使用场景详解
- 苦苦挣扎<?在Java中扩展T> wildcard
- java – Sql Server 2016:为SQL Server连接启用TLS 1.2
- java – 如何在IntelliJ中运行Play Framework 2.1项目?
- 在java中重用ResultSet对象
- 如何在java 8流中将参数化的getter称为映射器?