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?
This is about as close as you can get:
Unfortunately there's no way in Java to alter a generic type parameter of a generic type, like the
U
inT extends Collection<U>
. The equivalent of your array method would be a method that takes and returns Collection instances, like so: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:
Or, as long as you're returning the same object, you can always manually cast it back to its actual class: