强制转换一个对象类型是一个非常糟糕的设计。但在某些情况下,我们别无选择。Java从诞生之日起就有了这个功能。我认为Java8在某种程度上改进了这项古老的技术。静态变换Java中最常用的变换方法如下:静态变换Objectobj;//maybeanintegerif(objinstanceofInteger){IntegerobjAsInt=(Integer)obj;//dosomethingwith'objAsInt'}这里用到了Instanceof和变换操作符,而这些操作符已经融入了语言。对象转换的类型(本例中为Integer)必须在编译时静态确定,所以我们称这种类型的转换为静态转换。如果obj不是整数,上述测试将失败。如果我们以任何方式转换,我们将得到一个ClassCastException。如果obj为null,instanceof测试将失败,但转换会通过,因为null可以被任何类型引用。动态转换有一个不常见的技巧,就是使用Class的方法,这些方法与上述操作符的功能是一致的。动态转换为已知类型Objectobj;//maybeanintegerif(Integer.class.isInstance(obj)){IntegerobjAsInt=Integer.class.cast(obj);//dosomethingwith'objAsInt'注意本例中的类型转换也是编译周期是固定的,所以没有必要这样做。动态转换Objectobj;//maybeanintegerClasstype=//maybeInteger.classif(type.isInstance(obj)){TobjAsType=type.cast(obj);//dosomethingwith'objAsType'}因为转换后的类型是在编译时不知道,所以我们称这种变换为动态变换。错误类型和空转换的测试结果与静态转换完全相同。Stream和Optional的转换现在需要两步来转换Optional中的值或Stream中的元素:第一步,我们需要过滤掉错误的类型,然后我们需要将其转换为目标类型。Optional中的转换Optional>obj;//maycontainanIntegerOptionalobjAsInt=obj.filter(Integer.class::isInstance).map(Integer.class::cast);我们需要两步来完成改造,这没什么大不了的,但我还是觉得有些笨拙和多余。将来(可能)我建议Class的cast方法可以返回一个Optional或者Stream。如果传递的对象类型正确,则返回包含该对象的Optional或Stream。否则返回的Optional或Stream不包含任何元素。这些方法的实现很简单:ClasspublicOptionalcastIntoOptional(Objectobj){if(isInstance(obj))returnOptional.of((T)obj);elseOptional.empty();}publicStreamcastIntoStream上的新方法(Objectobj){if(isInstance(obj))returnStream.of((T)obj);elseStream.empty();}我们可以使用flatMap一步完成过滤和强制转换:FlatMap的实现:Stream>stream;//maycontainintegersStreamstreamOfInts=stream.flatMap(Integer.class::castIntoStream);错误的实例类型或空引用将在实例测试中失败,因此返回一个空的Optional或Stream。这样就永远不会抛出ClassCastException。成本和收益我们如何衡量这些方法是否真的有用?有多少代码实际使用了它们?它们是否提高了普通开发人员的代码可读性?值得为它省下一行代码吗?实施和维护它们的成本是多少?我对这些问题的回答是:不多,很少。所以,这是一个总和趋于零的博弈,但我可以证明,虽然收益不多,但大于零。你怎么认为?你自己会用这些方法吗?