栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何上载Java 8 Optional中包含的对象?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何上载Java 8 Optional中包含的对象?

我会写一个像这样的方法:

@SuppressWarnings("unchecked")  // Safe. See below.static <T> Optional<T> copyOf(Optional<? extends T> opt) {  return (Optional<T>) opt;}

(如果您不喜欢这个名字

copyOf
,请在
ImmutableList
下面查看我对番石榴的评论)

就运行速度而言,这是非常有效的:强制转换在编译时被忽略:

static <T> java.util.Optional<T> copyOf(java.util.Optional<? extends T>);    Code:       0: aload_0  # Read the parameter.       1: areturn  # Return the parameter.

因此,唯一的成本就是方法调用的成本。JIT可以轻松解决此问题。

然后可以像这样调用:

Optional<A> a = copyOf(func2());

这是安全的,因为

Optional
具有以下属性:保证不会因使用依赖于type变量的参数的setter方法引起任何状态更改
T
。ew
满口。我会更具体一些。

因为

Optional

  1. 没有setter方法(任何种类的,但更一般的是没有采取类型的参数
    T
    SomeGenericType<T>
    等)
  2. final
    (因此您不能将其子类化以添加违反前一点的二传手)

您无法对

Optional<T>
(或缺乏)持有的价值做任何事情,使其 不会 成为
T
(或缺乏)的实例。

而且由于的每个实例

T
也是其超类的实例,因此没有什么不安全的:

SuperclassOfT s = optionalOfT.get();

因此,此方法是类型安全的(如果您在不存在的可选对象上调用它,它将失败;但这不是类型错误)。

您将在Guava的

ImmutableList.copyOf
代码中找到类似的代码(上面的代码称为“
copyOf
” 的灵感,即使它并不是真正的副本)。在那里,那里
setter方法(像
add
),但这些方法马上抛出
UnsupportedOperationException
秒,因此不会影响到列表的状态。


请注意,尽管不可变类型具有上述必需的属性才能使这种类型转换安全,但是,为了安全地执行类型转换,该类型不一定必须是不可变的。

例如,您可能有一个

ErasableOptional<T>
类型,上面有一个
erase()
方法,该方法在被调用时将“当前”值转换为“不存在”值(即
get()
不再成功)。将这样的实例强制转换为an是安全的,
ErasableOptional<SupertypeOfT>
因为该值要么为a,
T
要么不存在;您不能使其
成为实例
SupertypeOfT
或不存在。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/574027.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号