Hello! 欢迎来到小浪资源网!


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


@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); }

相关阅读