@SafeVarargs注解真的能解决所有可变参数类型安全问题吗?

2024-11-30 16:48:22 编辑:抖狐科技 来源:摘自互联网

@safevarargs注解真的能解决所有可变参数类型安全问题吗?

@safevarargs 注意事项

@safevarargs 注解用于确保使用可变参数类型时不会出现数组类型安全问题。但是,虽然它可以防止某些类型的错误,但它并非万能的。

在您提供的示例中,使用 varargs 数组作为参数的方法是:

static <t> t[] asarray(t... objs) {
    return objs;
}

登录后复制

并尝试将其与以下方法一起使用:

static <k> k[] picktwo(k k1, k k2, k k3) {
    return asarray(k1, k2);
}

登录后复制

此代码会引发编译错误,因为 picktwo 方法返回的是一个 object[] 数组,而 asarray 方法期望的是一个 string[] 数组。

这是因为 @safevarargs 注解并不提供类型安全。它只会阻止将原始类型数组分配给通用类型数组,而这里的问题是试图将通用类型数组分配给一个不同类型的通用类型数组。

要解决此问题,可以将 asarray 方法重写为返回 list,而不是 t[]:

@safevarargs
static <t> list<t> aslist(t... objs) {
    return new arraylist<>(arrays.aslist(objs));
}

登录后复制

现在,picktwo 方法可以返回一个 list 而不会引发错误:

static <K> List<K> pickTwo(K k1, K k2, K k3) {
    return asList(k1, k2);
}

登录后复制

以上就是@SafeVarargs注解真的能解决所有可变参数类型安全问题吗?的详细内容,更多请关注抖狐科技其它相关文章!

本站文章均为抖狐网站建设摘自权威资料,书籍,或网络原创文章,如有版权纠纷或者违规问题,请即刻联系我们删除,我们欢迎您分享,引用和转载,我们谢绝直接复制和抄袭!感谢...
我们猜你喜欢