Java 8 中的(以及之后的?)类型转换

主要观点:将实例转换为类型的做法存在设计缺陷,但在某些情况下别无选择,Java 从一开始就具备此能力,Java 8 促使需改进该技术。
关键信息:

  • 静态类型转换:常用方式是使用instanceofcast运算符,转换的类型在编译时需静态已知,否则会出现ClassCastException或在objnull时出错。
  • 动态类型转换:通过Class的方法进行,类型在编译时未知,也会出现与静态类型转换类似的情况。
  • 流和可选类型中的转换:目前是两步操作,先过滤错误类型实例再进行转换,未来可实现Class的转换方法,用flatMap一步完成过滤和转换,错误类型或null引用会导致空的OptionalStream,不会出现ClassCastException
    重要细节:
  • 静态类型转换示例代码:Object obj; // may be an integer if (obj instanceof Integer) { Integer objAsInt = (Integer) obj; // do something with 'objAsInt' }
  • 动态类型转换示例代码:Object obj; // may be an integer if (Integer.class.isInstance(obj)) { Integer objAsInt = Integer.class.cast(obj); // do something with 'objAsInt' }以及Object obj; // may be an integer Class<T> type = // may be Integer.class if (type.isInstance(obj)) { T objAsType = type.cast(obj); // do something with 'objAsType' }
  • 流和可选类型中转换的示例代码:Optional<?> obj; // may contain an Integer Optional<Integer> objAsInt = obj.filter(Integer.class::isInstance).map(Integer.class::cast);以及Stream<?> stream; // may contain integers Stream<Integer> streamOfInts = stream.flatMap(Integer.class::castIntoStream);
  • 提议的转换方法实现:public Optional<T> castIntoOptional(Object obj) { if (isInstance(obj)) return Optional.of((T) obj); else Optional.empty(); }public Stream<T> castIntoStream(Object obj) { if (isInstance(obj)) return Stream.of((T) obj); else Stream.empty(); }
阅读 2
0 条评论