Por que a Cadeia :: isEmpty funciona quando o método não-estático não pode ser referenciada a partir de um contexto estático?

Mariano L:

Eu entendo a mensagem de erro. Eu sei que eu não posso métodos não-estáticos de acesso em um contexto estático. Mas por que eu posso fazer o seguinte:

Predicate<String> t = String::isEmpty; // this works

Quando isEmpty () é um método não-estático para a classe String? Olhe para o seguinte exemplo de classe. Eu entendo a lógica de não permitir TestLamba :: isEmptyTest; mas o que eu não entendo é por que Cordas: isEmpty pode quebrar essa regra:

import java.util.function.Predicate;

public class TestLamba {

    public static void main(String... args) {

        Predicate<String> t = String::isEmpty; // this works
        Predicate<String> t2 = TestLamba::isEmptyTest; // this doesn't
    }

    public boolean isEmptyTest() {
        return true;
    }

}

Esta é a fonte para String.isEmpty. É um método muito comum e você pode ver que não é estática:

public boolean isEmpty() {
    return this.value.length == 0;
}
Khalid Shah:

isEmptyé a função da Stringclasse e isEmptyTesté a função da TestLambaclasse.

import java.util.function.Predicate;

public class TestLamba {

    public static void main(String... args) {

        Predicate<String> t = String::isEmpty; // this works
        Predicate<TestLamba > t2 = TestLamba::isEmptyTest; //Now this will work
    }

    public boolean isEmptyTest() {
        return true;
    }

}

Acho que você gosta

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