主要观点:将实例转换为类型的做法存在设计缺陷,但在某些情况下别无选择,Java 从一开始就具备此能力,Java 8 促使需改进该技术。
关键信息:
- 静态类型转换:常用方式是使用
instanceof
和cast
运算符,转换的类型在编译时需静态已知,否则会出现ClassCastException
或在obj
为null
时出错。 - 动态类型转换:通过
Class
的方法进行,类型在编译时未知,也会出现与静态类型转换类似的情况。 - 流和可选类型中的转换:目前是两步操作,先过滤错误类型实例再进行转换,未来可实现
Class
的转换方法,用flatMap
一步完成过滤和转换,错误类型或null
引用会导致空的Optional
或Stream
,不会出现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(); }
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。