Genérico "es nulo" predicado

italktothewind:

Escribí este predicado genérico:

private static <T> Predicate<T> isNull(){
    return Objects::isNull;
}

Pero no puedo usarlo en combinación con otros predicados como este:

private static Predicate<String> isEmpty(){
    return string -> string.isEmpty();
}

Debido a que este fragmento no se compilará (espera predicado <String> en o servicio):

isNull().or(isEmpty())

Cualquier idea para resolver el problema? ¡Gracias!

Andreas:

Dado que isNull()es genérico, y el compilador no puede inferir el parámetro genérico cuando se combina el estilo, es necesario especificar explícitamente el parámetro de tipo.

Para hacer eso, usted debe calificar con el nombre de la clase, por ejemplo Test:

Test.<String>isNull().or(isEmpty())

Ejemplo completo:

public class Test {
    public static void main(String[] args) {
        Predicate<String> isNullOrEmpty = Test.<String>isNull().or(isEmpty());
        System.out.println(isNullOrEmpty.test(null));   // true
        System.out.println(isNullOrEmpty.test(""));     // true
        System.out.println(isNullOrEmpty.test("Foo"));  // false
    }
    private static <T> Predicate<T> isNull(){
        return Objects::isNull;
    }
    private static Predicate<String> isEmpty(){
        return string -> string.isEmpty();
    }
}

También puede resolverse mediante la asignación que cada parte a una variable:

Predicate<String> isNull = isNull(); // String is inferred from assignment operator
Predicate<String> isEmpty = isEmpty();
Predicate<String> isNullOrEmpty = isNull.or(isEmpty);

O simplemente la primera parte:

Predicate<String> isNull = isNull();
Predicate<String> isNullOrEmpty = isNull.or(isEmpty());

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=186603&siteId=1
Recomendado
Clasificación