A interface abaixo é uma interface funcional válida no Java 8?
@FunctionalInterface
interface Normal{
public abstract String move();
public abstract String toString() ;
}
Por que isso não me dá um erro de tempo de compilação?
A interface abaixo é uma interface funcional válida no Java 8?
@FunctionalInterface
interface Normal{
public abstract String move();
public abstract String toString() ;
}
Por que isso não me dá um erro de tempo de compilação?
Respostas:
O que Alok citou é verdade, mas ele ignorou algo, o que torna sua resposta final (que o código é inválido) errada:
A interface possui um método String toString()
que toda classe já implementa, herdando-a Object
. Ou seja, o método da interface declarada já possui uma implementação, semelhante a um método padrão. Portanto, não há erro de compilação e Normal
pode ser usado como uma interface funcional, como mostrado no meu MCVE :
package de.scrum_master.stackoverflow;
@FunctionalInterface
interface Normal {
String move();
String toString();
}
BTW, não há necessidade de declarar métodos de interface como public
sempre. O mesmo vale para abstract
.
package de.scrum_master.stackoverflow;
public class NormalApp {
static void doSomething(Normal normal) {
System.out.println(normal.move());
System.out.println(normal.toString());
}
public static void main(String[] args) {
doSomething(() -> "xxx");
}
}
Se você executar o aplicativo de driver, verá este log do console:
xxx
de.scrum_master.stackoverflow.NormalApp$$Lambda$1/1530388690@28c97a5
Agora, se você alterar o nome do método toString
para outra coisa, por exemplo toStringX
, verá que devido à @FunctionalInterface
mensagem de erro esperada ao compilar a classe:
Unexpected @FunctionalInterface annotation
de.scrum_master.stackoverflow.Normal is not a functional interface
multiple non-overriding abstract methods found in interface de.scrum_master.stackoverflow.Normal
Primeiro de tudo, Nitin, você precisa ter uma pesquisa adequada sobre isso e, em seguida, você deve entrar nesta plataforma para perguntar sobre o seu problema.
No entanto, antes de tudo, deixe-me esclarecer sua dúvida sobre a Interface Funcional em Java 8
- A Interface Funcional no Java 8 pode ter apenas um método abstrato e qualquer número de métodos padrão.
- A partir do Java 8, expressões lambda podem ser usadas para representar a instância de uma interface funcional.
- A anotação @FunctionalInterface é usada para garantir que a interface funcional não possa ter mais de um método abstrato. Caso mais de um método abstrato esteja presente, o compilador sinaliza uma
Unexpected @FunctionalInterface annotation
mensagem. No entanto, não é obrigatório usar esta anotação.
Conforme apenas o seu código, eu pude ver dois métodos abstratos; portanto , seu código é inválido .
Espero que ajude você de alguma forma. Para obter mais informações, consulte este link: Java 8 Functional Interface