Java generic with return type that has @NonNull with Collections

眉间皱痕 提交于 2019-12-11 02:58:27

问题


I want to implement a generic function in Java8, that verifies that a collection has no null members and returns a type with @NonNull annotation.

input type: T extends Collection, where T+U are nullable.
result type: @NonNull T, with @NonNull U

For array this would look like this:

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

But for the collection case, i don't know how to define that the result type is the same as the input type, but has the @NonNull annotations for the collection and the element type.
This is what i want to do, but it is not valid syntax:

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

Can you help?


回答1:


Unfortunately there's no way in Java to alter a generic type parameter of a generic type, like the U in T extends Collection<U>. The equivalent of your array method would be a method that takes and returns Collection instances, like so:

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

This accepts any subclass of Collection, but the return type can't be more specific than Collection.

To handle more specific cases, I would suggest having a few more methods for common subclasses:

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)

Or, as long as you're returning the same object, you can always manually cast it back to its actual class:

ArrayList<@NonNull E> list2 = (ArrayList<@NonNull E>) collectionHasNoNullMember(arrayList);



回答2:


This is about as close as you can get:

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


来源:https://stackoverflow.com/questions/41006241/java-generic-with-return-type-that-has-nonnull-with-collections

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!