java中无法推断类型参数_Java中的推断异常

java中无法推断类型参数

借用和窃取其他语言的概念和想法总是很高兴的。 Scala的Option是我真正喜欢的一个主意,因此我用Java编写了一个实现。 它包装了一个可能为null或不为null的对象,并提供了一些可用于某种分类功能的方法。 例如,isDefined方法添加了一种检查值是否为null的面向对象的方法。 然后在其他地方使用它,例如getOrElse方法,该方法基本上说“给我您要包装的内容,如果没有,则回退”。

public T getOrElse(T fallback)
{return isDefined() ? get() : fallback;
}

实际上,这将替代传统的Java,例如

public void foo()
{String s = dao.getValue();if (s == null){s = 'bar';}System.out.println(s);
}

与更简洁和面向对象

public void foo()
{Option<String> s = dao.getValue();System.out.println(s.getOrElse('bar'));
}

但是,如果我想做一个除获得后备值之外的事情-抛出异常,该怎么办? 更重要的是,如果我想抛出特定类型的异常(即使用时特定且未硬编码到Option中)怎么办? 这需要一点技巧,并且要进行类型推断。

因为这是Java,所以我们可以从一个新工厂– ExceptionFactory开始。 这是一个基本的实现,仅创建使用消息构造的异常,但是您当然可以根据需要扩展代码。

public interface ExceptionFactory <E extends Exception>
{E create(String message);
}

注意<E extended Exception> -这是它如何工作的关键。 使用工厂,我们现在可以向Option添加新方法:

public <E extends Exception> T getOrThrow(ExceptionFactory<E> exceptionFactory,String message) throws E
{if (isDefined()){return get();}else{throw exceptionFactory.create(message);}
}

同样,请注意引发E –这是从异常工厂推断出来的。

不管您信不信,这就是所需费用的90%。 一种烦恼是需要异常工厂。 如果您能忍受这一切,那么一切都准备就绪。 让我们定义几个自定义异常,以了解实际情况。

public <E extends Exception> T getOrThrow(ExceptionFactory<E> exceptionFactory,String message) throws E
{if (isDefined()){return get();}else{throw exceptionFactory.create(message);}
}

和可疑的ExceptionB类似

public class ExceptionB extends Exception
{public ExceptionB(String message){super(message);}public static ExceptionFactory<ExceptionB> factory(){return new ExceptionFactory<ExceptionB>(){@Overridepublic ExceptionB create(String message){return new ExceptionB(message);}};}
}

最后,将它们放在一起:

public class GenericExceptionTest
{@Test(expected = ExceptionA.class)public void exceptionA_throw() throws ExceptionA{Option.option(null).getOrThrow(ExceptionA.factory(),"Some message pertinent to the situation");}@Testpublic void exceptionA_noThrow() throws ExceptionA{String s = Option.option("foo").getOrThrow(ExceptionA.factory(),"Some message pertinent to the situation");Assert.assertEquals("foo",s);}@Test(expected = ExceptionB.class)public void exceptionB_throw() throws ExceptionB{Option.option(null).getOrThrow(ExceptionB.factory(),"Some message pertinent to the situation");}@Testpublic void exceptionB_noThrow() throws ExceptionB{String s = Option.option("foo").getOrThrow(ExceptionB.factory(),"Some message pertinent to the situation");Assert.assertEquals("foo",s);}
}

如上以粗体突出显示的,需要注意的重要一点是方法签名中声明的异常是特定的–它不是共同的祖先(Exception或Throwable)。 这意味着您现在可以在任何地方的DAO层,服务层中使用“选项”,并在需要的地方和方式中抛出特定的异常。

下载源 :您可以从此处获取源代码和测试– Genex

边注
编写此文档后产生的另一件有趣的事情是观察到可以执行此操作:

public void foo()
{throw null;
}public void bar()
{try{foo();}catch (NullPointerException e){...}
}

不用说,这不是一个好主意。

参考: Objectify博客上的JCG合作伙伴 Steve Chaloner 推断出Java中的异常 。

翻译自: https://www.javacodegeeks.com/2013/01/inferred-exceptions-in-java.html

java中无法推断类型参数

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

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

相关文章

H3C 三种生成树协议特性的比较

转载于:https://www.cnblogs.com/fanweisheng/p/11153361.html

使用HazelCast进行休眠缓存:基本配置

以前&#xff0c;我们对JPA缓存&#xff0c;机制以及hibernate提供的内容进行了介绍 。 接下来是一个使用Hazelcast作为二级缓存的休眠项目。 为此&#xff0c;我们将在JPA中使用一个基本的spring boot项目。 Spring Boot使用休眠作为默认的JPA提供程序。 我们的设置将非常接…

mysql事务实战_mysql事务隔离级别详解和实战

A事务做了操作 没有提交 对B事务来说 就等于没做 获取的都是之前的数据但是 在A事务中查询的话 查到的都是操作之后的数据没有提交的数据只有自己看得到&#xff0c;并没有update到数据库。查看InnoDB存储引擎 系统级的隔离级别 和 会话级的隔离级别&#xff1a;mysql> sele…

微云 linux_编年史与微云

微云 linux总览 我面临的一个常见问题是&#xff1a; 如果是单个作者&#xff0c;多个读者&#xff0c;如何缩放基于Chronicle的系统。 尽管有解决此问题的方法&#xff0c;但很有可能根本不会有问题。 微云 这是我用来描述单个线程来完成当前由多个服务器完成的工作的术语。 …

H3C 计算子网内可用主机地址数

转载于:https://www.cnblogs.com/fanweisheng/p/11153665.html

mysql中两次排序_MySQL中的两种排序方式: index和filesort

index &#xff1a;通过有序索引顺序扫描直接返回有序数据&#xff0c;不需要额外的排序&#xff0c;操作效率较高。filesort&#xff1a;通过对返回数据进行排序&#xff0c;filesort 并不代表通过磁盘文件排序&#xff0c;而是说明进行了一个排序操作&#xff0c;至于排序操作…

Java命令行界面(第2部分):args4j

在上一篇文章中 &#xff0c;我研究了如何使用Apache Commons CLI在Java应用程序中解析命令行参数。 在本文中&#xff0c;我将使用另一个库args4j进行相同的操作。 args4j采用了一种不同于Commons CLI的方式来指定Java应用程序应期望的命令行参数。 尽管Commons CLI期望代表选…

mysql my.cnf在哪里_my.cnf配置文件在哪

my.cnf配置文件在linux上是位于路径“/etc/my.cnf”下&#xff0c;在window上则位于安装目录的根目录下&#xff1b;可以使用命令“mysql --help”查看关于MYSQL对应配置文件“my.cnf”搜索顺序。一般linux上都放在 /etc/my.cnf ,window 上安装都是默认可能按照上面的路径还是没…

深入学习Mybatis框架(二)- 进阶

1.动态SQL 1.1 什么是动态SQL&#xff1f; 动态SQL就是通过传入的参数不一样,可以组成不同结构的SQL语句。 这种可以根据参数的条件而改变SQL结构的SQL语句,我们称为动态SQL语句。使用动态SQL可以提高代码重用性。 1.2 XML方式的实现 1.2.1 需要使用到的标签 <if> 用于判…

近似线性依靠matlab_不要仅仅依靠单元测试

近似线性依靠matlab当您构建一个复杂的系统时&#xff0c;仅仅测试组件是不够的。 这很关键&#xff0c;但还不够。 想象一下一家汽车厂生产和进口最高质量的零件&#xff0c;但组装好汽车后再也没有启动发动机。 如果您的测试用例套件几乎不包含单元测试&#xff0c;那么您将永…

戏说 .NET GDI+系列学习教程(三、Graphics类的方法的总结)

转载于:https://www.cnblogs.com/WarBlog/p/11157395.html

从关系数据库到Elasticsearch的索引数据– 1

Elasticsearch提供强大的搜索功能&#xff0c;并支持数据的分片和复制。 因此&#xff0c;我们希望将数据库中可用的数据索引到Elasticsearch中。 有多种方法可以将数据索引到Elasticsearch中&#xff1a; 使用Logstash将源设置为DB&#xff0c;将接收器设置为Elasticsearch&…

mysql 求bit 某位为1_mysql按位的索引判断值是否为1

DELIMITER $$DROP FUNCTION IF EXISTS value_of_bit_index_is_true$$/*计算某个数字的某些索引的位的值是否都为1&#xff0c;索引类似1,2,3,4*/CREATE FUNCTION value_of_bit_index_is_true(number INT, idxies VARCHAR(50)) RETURNS INT(11)BEGIN/*将1,2,3,4,5,6这样的字符串…

python math.asin

import mathmath.asin(x) x : -1 到 1 之间的数值。如果 x 是大于 1&#xff0c;会产生一个错误。 #!/usr/bin/pythonimport math print "asin(0.64) : ", math.asin(0.64)print "asin(0) : ", math.asin(0)print "asin(-1) : ", math.asin(-1)p…

消息队列mysql redis那个好_Redis与RabbitMQ作为消息队列的比较

简要介绍RabbitMQRabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种&#xff0c;最初起源于金融系统&#xff0c;用于在分布式系统中存储转发消息&#xff0c;在易用性、扩展性、高可用性等方面表现不俗。消息中间件主要用于组件之间的解耦&#xff0c;消息的发送者无需…

mysql 添加远程连接_为 mysql 添加远程连接账户

1、以管理员身份登录mysqlmysql -u root -p2、选择mysql数据库use mysql3、创建用户并设定密码create user [email protected] identified by ‘123456‘4、使操作生效flush privileges5、使操作生效flush privileges6、用新用户登录mysql -u test -p允许用户从远程访问数据库的…

包装类型与包装类别_包装的重要性

包装类型与包装类别我记得大约15年前开始学习Java的时候。 我读到了很多有关“包装”和“命名空间”的东西&#xff0c;但我完全不了解。 可悲的是&#xff1a;虽然包装的某些方面几乎为行业中的每个人所了解&#xff0c;但其他方面却不是。 因此&#xff0c;让我们看一下哪些软…

isinstance和issubclass

目录 一、isinstance与type二、issubclass一、isinstance与type 在游戏项目中&#xff0c;我们会在每个接口验证客户端传过来的参数类型&#xff0c;如果验证不通过&#xff0c;返回给客户端“参数错误”错误码。 这样做不但便于调试&#xff0c;而且增加健壮性。因为客户端是可…

animation动画不生效_你可能不知道的Animation动画技巧与细节

引言在 web 应用中&#xff0c;前端同学在实现动画效果时往往常用的几种方案&#xff1a;css3 transition / animation - 实现过渡动画setInterval / setTimeout - 通过设置一个间隔时间来不断的改变图像的位置requestAnimationFrame - 通过一个回调函数来改变图像位置&#xf…

eclipse查看jar包源代码

方法一&#xff1a;将jd-gui集成在Eclipse中 https://jingyan.baidu.com/article/b24f6c8275536686bfe5daed.html 下载2个反编译文件&#xff0c;实际操作未解决 https://www.cnblogs.com/jianshuai520/p/9267273.html 反编译器的位置&#xff0c;发生改变 方法二&#xf…