2

我想在 Java8 中实现一个通用函数,它验证一个集合没有空成员并返回一个带有 @NonNull 注释的类型。

输入类型:T 扩展集合,其中 T+U 可以为空。
结果类型:@NonNull T,带有@NonNull U

对于数组,这看起来像这样:

public static <T> @NonNull T @NonNull[] arrayHasNoNullMember( @Nullable T @Nullable[] value) {

但是对于集合情况,我不知道如何定义结果类型与输入类型相同,但具有集合和元素类型的@NonNull 注释。
这是我想做的,但它不是有效的语法:

public static <T extends Collection<U>, U> @NonNull T<@NonNull U> collectionHasNoNullMember(T<U> col) {

你能帮我吗?

4

2 回答 2

1

不幸的是,Java 中无法更改泛型类型的泛型类型参数,例如Uin T extends Collection<U>。您的数组方法的等价物将是一个接受并返回 Collection 实例的方法,如下所示:

public static <E> @NonNull Collection<@NonNull E> collectionHasNoNullMember(@Nullable Collection<? extends @Nullable E> col)

这接受 Collection 的任何子类,但返回类型不能比 Collection 更具体。

为了处理更具体的情况,我建议为公共子类提供更多方法:

public static <E> @NonNull List<@NonNull E> listHasNoNullMember(@Nullable List<? extends @Nullable E> list)
public static <E> @NonNull Set<@NonNull E> setHasNoNullMember(@Nullable Set<? extends @Nullable E> set)
public static <E> @NonNull Queue<@NonNull E> queueHasNoNullMember(@Nullable Queue<? extends @Nullable E> queue)

或者,只要您返回相同的对象,您始终可以手动将其转换回其实际类:

ArrayList<@NonNull E> list2 = (ArrayList<@NonNull E>) collectionHasNoNullMember(arrayList);
于 2017-04-26T19:44:57.197 回答
0

这大约是你能得到的最接近的:

public static <T extends Collection<@NonNull U>, U> @NonNull T collectionHasNoNullMember(@NonNull T col) {
于 2016-12-06T22:52:29.627 回答