Lambda expressions are only usable with functional interface as said by Eran but if you really need multiple methods within the interfaces, you may change the modifiers to default
or static
and override them within the classes that implement them if necessary.
public class Test {
public static void main(String[] args) {
I1 i1 = () -> System.out.println(); // NOT LEGAL
I2 i2 = () -> System.out.println(); // TOTALLY LEGAL
I3 i3 = () -> System.out.println(); // TOTALLY LEGAL
}
}
interface I1 {
void show1();
void show2();
}
interface I2 {
void show1();
default void show2() {}
}
interface I3 {
void show1();
static void show2 () {}
}
Inheritance
You shouldn't forget the inherited methods.
Here, I2
inherits show1
and show2
and thus can not be a functional interface.
public class Test {
public static void main(String[] args) {
I1 i1 = () -> System.out.println(); // NOT LEGAL BUT WE SAW IT EARLIER
I2 i2 = () -> System.out.println(); // NOT LEGAL
}
}
interface I1 {
void show1();
void show2();
}
interface I2 extends I1 {
void show3();
}
Annotation
To make sure your interface is a functional interface, you may add the following annotation @FunctionalInterface
@FunctionalInterface <------- COMPILATION ERROR : Invalid '@FunctionalInterface' annotation; I1 is not a functional interface
interface I1 {
void show1();
void show2();
}
@FunctionalInterface
interface I2 {
void show3();
}
functional interfaces
? make all additional methods asdefault
– Andrew Tobilkopublic abstract
modifiers.default
says that the method has to be implemented – Andrew Tobilko