Question: Need to understand why in case of Program 1 getting this misleading error, but in Program 2 it gives correct error? Also why unlike toString(),
equals(Object),
and hashCode(),
overriding clone()
and finalize()
inside interface is allowed?
Program 1
For below program getting misleading error:
FOO.java:10: error: finalize() in Object cannot implement finalize() in ClonerFinalizer
public class FOO implements ClonerFinalizer {
^
attempting to assign weaker access privileges; was public
interface ClonerFinalizer {
default Object clone() {
System.out.println("default clone"); return this;
}
default void finalize() {
System.out.println("default finalize");
}
}
public class FOO implements ClonerFinalizer {
// @Override
// public Object clone() {
// return ClonerFinalizer.super.clone();
// }
// @Override
// public void finalize() {
// ClonerFinalizer.super.finalize();
// }
public static void main(String... args) {
new FOO().clone();
new FOO().finalize();
}
}
But if uncommenting above commented code then it gives correct output.
Program 2
Unlike above program in below program clear/correct error
FOO.java:2: error: default method toString in interface ToStringer overrides a member of java.lang.Object
default String toString() {
^
1 error
interface ToStringer {
default String toString() {
System.out.println("default clone"); return "HI";
}
}
public class FOO implements ToStringer {
@Override
public String toString() {
return ToStringer.super.toString();
}
public static void main(String... args) {
new FOO().toString();
}
}