java中的方法求和_在Java中模拟求和类型的巧妙解决方法

java中的方法求和

在继续阅读实际文章之前,我想感谢令人敬畏的Javaslang库的作者Daniel Dietrich ,他在我面前有了这个主意:

逆变通用界

这一切都始于一条推文:

我想做一些事情,像模式匹配一​​组类型的一个普通的超级类型,方法如下:

<T super T1 | T2 | ... | TN>

请注意,我真正想要的是对联合类型的支持,而不是我最初声称的交集类型。

我为什么要这样做? 因为它将很好地添加到jOOλ库中 ,该库具有Java的类型安全元组 :

class Tuple3<T1, T2, T3> {final T1 v1;final T2 v2;final T3 v3;// Lots of useful stuff here
}

在元组中最好的是迭代所有属性的forEach()方法:

tuple(1, "a", null).forEach(System.out::println);

上面将简单地产生:

1
"a"
null

现在,此forEach()方法的参数类型是什么? 它看起来像这样:

class Tuple3<T1, T2, T3> {void forEach(Consumer<? super T1 | T2 | T3> c) {}
}

消费者将收到类型为T1 T2 T3的对象。 但是接受前面三种类型的普通超级类型的消费者也可以。 例如,如果我们有:

Tuple2<Integer, Long> tuple = tuple(1, 2L);
tuple.forEach(v->System.out.println(v.doubleValue()));

上面的代码可以编译,因为NumberIntegerLong的常见超类型,并且它包含doubleValue()方法。

不幸的是,这在Java中是不可能的

Java当前仅对异常捕获块支持联合/求和类型( 另请参见代数数据类型 ),您可以在其中编写以下内容:

class X extends RuntimeException {void print() {}
}
class X1 extends X {}
class X2 extends X {}// With the above
try {...
}
catch (X1 | X2 e) {// This compiles for the same reasons!e.print();
}

但是不幸的是,catch块是Java中唯一允许使用求和类型的地方。

这是Daniel巧妙而狡猾的解决方法发挥作用的地方。 我们可以编写一个静态方法来使用泛型执行某种“模式匹配”(如果您斜视),反之亦然:

static <T, T1 extends T, T2 extends T, T3 extends T
> 
void forEach(Tuple3<T1, T2, T3> tuple, Consumer<? super T> consumer
) {consumer.accept(tuple.v1);consumer.accept(tuple.v2);consumer.accept(tuple.v3);
}

现在可以安全地使用以上方法来推断T1,T2和T3的公共超级类型:

Tuple2<Integer, Long> t = tuple(1, 2L);
forEach(t, c -> {System.out.println(c.doubleValue());
});

符合预期:

1.0
2.0

这是有道理的,因为泛型类型约束是简单地“相反地”指定的,即当T1 extends T强制T1 extends T ,强制是T super T1

如果你真的很quin眼;-)

据说Daniel在Javaslang即将推出的模式匹配API中使用了此技术。 我们期待看到这一结果!

翻译自: https://www.javacodegeeks.com/2016/02/ingenious-workaround-emulate-sum-types-java.html

java中的方法求和

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java如何模拟请求_单元测试如何模拟用户请求

python web自动化测试设计构工具书40.9元包邮(需用券)去购买 >错误正当我高高兴兴写完后台c层的测试代码准备提交时&#xff0c;测试机器人报了很多401错误&#xff0c;把代码拉下来一看&#xff0c;原来当我写代码时&#xff0c;我的伙伴已经写好后台的拦截器了&#xff0c…

LeetCode 237. 删除链表中的节点

原题链接 解题思路&#xff1a;后面的的结点内容覆盖前面的结点内容 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:void deleteNode(ListN…

java异步接口转同步接口_如果今天设计了Java:同步接口

java异步接口转同步接口Java已经走了很长一段路。 很长的路要走。 它带有早期设计决策中的所有“垃圾”。 一遍又一遍后悔的一件事是&#xff0c; 每个对象&#xff08;可能&#xff09;都包含一个监视器 。 几乎没有必要这样做&#xff0c;并且最终在Java 5中纠正了该缺陷&am…

LeetCode 83. 删除排序链表中的重复元素

原题链接 解法&#xff1a;通过一个指针从头到尾进行扫描 class Solution { public:ListNode* deleteDuplicates(ListNode* head) {if(!head)return nullptr;auto p1 head;while(p1->next){if(p1->next->val p1->val)p1->nextp1->next->next;else p1 …

java 使按钮被选中_java – 让我的单选按钮在Android中被选中

当我运行时,可以单击对话框,我的单选按钮不会像预期的那样被选中package edu.elon.cs.mobile;public class PTCalculator extends Activity{private RadioButton maleRadioButton;private RadioButton femaleRadioButton;private EditText ageEdit;private EditText pushUpsEdi…

后端 java ee_刷新器-Java EE 7后端十大功能

后端 java ee这是我的小型Java EE 7复习系列的第二部分。 在进行了简要概述的第一篇介绍之后&#xff0c;我决定请Arjan Tijms撰写有关Java EE 7中他最喜欢的后端新功能的信息。如果您关注Java EE领域&#xff0c;您将会知道Arjan。 他是Java EE开发人员&#xff0c;JSF和Secur…

java enum 报错_enum报错问题,求大神帮看下

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼public enum OrderStatusEnum {NOT_PAY("未付款", 0),NOT_YET_SHIPPEND("待发货", 1),YET_SHIPPEND("已发货", 2),HAS_BEEN_COMPLETED("已完成", 3),HAS_BEEN_CANANCELLED("已取消&q…

LeetCode 160 相交链表

原题链接 解题思路1&#xff1a;哈希表 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode *getIntersectionNode(ListNode *headA, L…

java cucumber_为Java + STANDARD值引入Cucumber

java cucumber作为软件开发人员&#xff0c;我们都有最喜欢的工具来使我们成功。 许多人在开始工作时就很适合这份工作&#xff0c;但很快就不见了。 其他人则需要太多的设置和培训才能“将脚趾浸入水中”&#xff0c;只是为了简单地确定它们是否是正确的工具即可。 Cucumber …

LeetCode 234 回文链表

原题链接 解题思路&#xff1a;使用vector来存储链表&#xff0c;然后来检查其中每一个元素&#xff0c;是否组成回文 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/…

文章id 文章标题点击量php,WordPress如何通过文章ID获取文章标题等信息

如果我们想要在某一个主题的php文件中调用文章的标题&#xff0c;内容等信息&#xff0c;而在WordPress中唯一一直不会改变的就是文章发布时生成的ID&#xff0c;我们只需要获取文章的ID&#xff0c;即可通过文章ID来获取我们想要的文章信息。调用方法php$id // 文章的 id$tit…

javafx 表格列拖拉_JavaFX技巧22:“自动调整大小(树)”表列

javafx 表格列拖拉JavaFX “缺少功能调查”中提到的“缺少功能”的第一件事就是能够自动调整表/树表中的列大小。 没错&#xff0c;没有公共API是正确的&#xff0c;但是当您密切关注时&#xff0c;您会注意到JavaFX内部一定有执行此操作的代码&#xff0c;因为用户可以通过双击…

LeetCode 1290 二进制链表转整数

原题链接 解题思路&#xff0c;二进制转十进制模拟法 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:int getDecimalValue(ListNode* head)…

java 实例对象拷贝,实例详解java对象拷贝

这篇文章主要介绍了java对象拷贝详解及实例的相关资料,需要的朋友可以参考下java对象拷贝详解及实例Java赋值是复制对象引用&#xff0c;如果我们想要得到一个对象的副本&#xff0c;使用赋值操作是无法达到目的的&#xff1a;Testpublic void testassign(){Person p1new Perso…

LeetCode 344 反转字符串

原题链接 解题思路&#xff1a;双指针首位交换&#xff0c;两个指针重合遍历交换完成 class Solution { public:void reverseString(vector<char>& s) {if(s.empty())return;int left0;int rights.size()-1;while(left<right){swap(s[left],s[right]);left;righ…

javaone_JavaOne 2015:高级模块化开发

javaoneJavaOne 2015看到了Project Jigsaw团队关于Java 9中的模块化的一系列讨论 。它们都是非常有趣的&#xff0c;并且充满了宝贵的信息&#xff0c;我敦促每个Java开发人员都注意它们。 除此之外&#xff0c;我想给社区一种搜索和引用它们的方法&#xff0c;因此我在这里总…

php劫持代码,利用php来嗅探劫持服务器数据

前几天刺在我们的maillist发了一个老外写的文章&#xff0c;大意是可以用php来实现数据的劫持和转发。我瞄了一下&#xff0c;确实可行&#xff0c;于是今天抽出了以前用来扯淡的时间&#xff0c;写了段代码验证了一下想法。老外的原文是一个PDF&#xff0c;有兴趣看的可以看看…

LeetCode 371 两个整数之和

原题链接 解题思路&#xff1a;位运算 class Solution { public:int getSum(int a, int b) {while(b){auto c((unsigned int) a & b)<<1;aa^b;bc;}return a;} };

spark rest_Spark简介,您的下一个REST Java框架

spark rest我希望您今年Java来了&#xff01; 今天&#xff0c;我们将研究一个清新&#xff0c;简单&#xff0c;美观且实用的框架&#xff0c;以Java编写REST应用程序。 它将非常简单&#xff0c;甚至根本不会看起来像Java。 我们将研究Spark Web框架。 不&#xff0c;它与Ap…

php求完数,php算法:求完全数 | 学步园

完全数&#xff1a;如果一个数的所有因数(不包括本身)的和刚好等于这个数自身&#xff0c;那么这个数就叫完全数求完全数function get_mul($num){for($i1;$i<$num;$i){for($j1;$j{//内层for循环求一个数的除自身外的所有因数if($i%$j0){$arr[]$j;}}if(isset($arr)){if(array…