Java default Interface Methods - java

Here is my simple code from a Java Tutorial.
public interface AnimalIntf {
default public String identifyMyself(){
return "I am an animal.";
}
}
I get an error: illegal start of type interface methods cannot have body.
The method is default and the default keyword is used at the beginning of the method signature.
Could you please explain to me what is wrong?

Default interface methods were introduced in Java 8, so you need a JDK that supports Java 8 or later.

You must use Java 8 or above to have default implementations in interfaces. Instead you could use an abstract class. But even then, you wouldn't use the default keyword.

Strange things are happening...
After the JDK update to version 8 both on computer and in IDE settings, the code compiles OK, but the IDE still marks the line
default public String identifyMyself(){
as error. And there were still errors while trying to use the interface, asking to override the default method in the class that implements the interface.
public class Dragon implements Animal{
}
2 hours later I got tired of trying to fix my NetBeans v.6.9.1 and downloaded NetBeans v8.0.1.
Now I am fine :)

Related

if functional interface came in java version 8 then how #FunctionalInterface annotation working in java version 7 or less

#FunctionalInterface interface inter1 { public void show(); }
this program compiles and runs fine when I used 1.6 version to compile
A Functional Interface refers to an interface that has one non-default, and one non-static method. This concept was has always been existing.
This can be implemented either by a class that implements this interface or through a Lambda expression that was introduced from Java 8 onwards.
Annotations that aren't available on the classpath at runtime are silently suppressed; this applies to any annotations generally.
Note that what you're doing is risky and is probably giving you warnings about mismatched target levels and JDKs; that's exactly because in other cases, using JDK features not available on the target will result in errors when trying to load the class at runtime. You got away with it only because it's an annotation, which is always optional.

Why doesn't extends work with implements?

I know it's supposed to work, but it doesn't. I have a class inheritance defined as follows:
public class VisitManagementForm extends FormWithTitle implements Property.ValueChangeListener {
Now it only allows to override the methods from extends, it doesn't make and indeed doesn't even allow me to implement/override methods from Property.ValueChangeListener. Why is that?
I switched places of implements with extends, then only the implements worked and the extends didn't seem visible.
I recently turned the project to Maven, is it possible Maven is causing this madness? Maybe I need to specify something to allow this with it? Or am I just missing something in here?
Property.ValueChangeListener is supposed to force implement this method like this:
#Override
public void valueChange(ValueChangeEvent event) {
// TODO Auto-generated method stub
}
However now I get the error for it that it needs to override or implement a supertype method...
Edit: I'm using Java 1.6 for the project.
Edit: also if I try to implement something else (while leaving the extends there), it suggests me to implement the methods, but if I implement ValueChangeListener it doesn't suggest me to implement anything, but if you then remove the extends and leave just implements ValueChangeListener, it then suggest to implement it's methods again. But as long as I keep the extends, I seem to get the error mentioned above.
Note that you cannot add the #Override annotation to a method implementing an interface in Java 5 - it generates an error. It is allowed in Java 6
Source
What you are doing is illegal multiple inheritance. Check this example from of Java Language specification
If this is code that worked before you switched to maven, the reason could be that the maven compiler plugin by default sets the source version to 1.5, which means, as already mentioned in another answer, you cannot use #Override for interface methods.

Some #Override shows errors in Oracle Java but not in OpenJDK

In a repository that was created in Ubuntu Linux and compiled under OpenJDK 6, when implementing LocationListener and SensorListener, adding the #Override tag above the inherited methods compiles fine.
But when the repo is cloned onto a Windows system with Oracle Java, some of the #Override generates errors. Example below:
The method onAccuracyChanged(Sensor, int) of type ExpeditionActivity must override a superclass method
It seems that this error occurs only when you add #Override above a method that is inherited from implementing an interface. Adding #Override above a method inherited from a base class does not generate the error. This actually makes sense, because you are actually overriding the logic of the original method.
SO, is it syactically correct to write #Override above inherited interface methods?
#Override is limited to base class methods in JDK 5.
JDK 6 introduced the ability to apply #Override to interface methods.
Eclipse must be set to use JDK6/JDK6 language level to use #Override on interface methods.
To answer your question, "yes, if you're compiling under JDK 6+".
I'm getting it sometimes.
Not quite sure what the reasons for it are.
A few ways I found of fixing it. Maybe some of them would work for you
Sometimes it helps simply deleting the method decleration and rewriting it.
Make sure the parameters and return value are correct. For example, in Andrdid, when you extend AsyncTask you give the extended class 3 parameters, based on these paratmeters you need to override the methods with the correct parameters and return value.
If the method are required for the interface/base class, try deleting the method. An error would appear under the interface/base class. Put your mouse cursor on it and select Add Unimplemented methods this would make eclipse add these methods and you would have to re-fill the body, but the error would disapper.
I do believe this is an Eclipse error, because removing the #Override annotation doesn't affect the code, the code compiles and runs correctly.
Good luck

Eclipse: always notice error when use #Override [duplicate]

This question already has answers here:
'Must Override a Superclass Method' Errors after importing a project into Eclipse
(13 answers)
Closed 9 years ago.
I don't know why each time I implements a class. when I use #Override Eclipse always notice error:
the method A of type B must override a superclass method
(With method A is method that I override and B is the current class I work with)
And Eclipse recommend delete #Override
But with the same code, I work on Idea, no error found.
Who can tell me why,please.
thanks :)
#Edit: Oh, I don't post exactly code because It happend for all when I implement sth:
for example:
public class helloworld implements Runnable {
#Override //this line no-error with Idea and error with eclipse:the method run of type helloworld must be override a super class
public void run(){
}
Java 5 only properly supports this annotation on methods you override when subclassing. Starting with Java 6 you can also use this annotation on methods that implement methods from an interface.
Check your compliance setting. It should be JDK 6+
It's a java version issue. In one IDE you are using JDK 6/7 which allow this. In another you are using Java 5, which did not.

What's the good of IDE's auto generated #override annotation?

I am using eclipse , when I use shortcut to generate override implementations , there is an override annotation up there , I am using JDK 6 , this is all right , but under JDK 5 this annotation will cause an error, so I want to ask , if this annotation is completely useless ? Will compiler do some kind of optimization using this annotation ?
Its purpose is for the compiler to be able to tell you when the method is not in fact overriding the super class method. For example, suppose you misspelled the name, with the anotation the compiler will warn you that the method is not overriding anything, and so you'll be able to catch your error, instead of running your program and not understanding why your method never gets called.
As others have pointed out, the #Override annotation is really a compiler directive that instructs javac to scream if a method annotated with #Override does not actually override a method in its parent class (e.g. you're actually overloading because you've decided to change the method signature or you misspell the method name).
Under JDK 5, directly implementing a method from an interface is not considered overriding that method and is considered an error if annotated with #Override.
In part due to user feedback that this was a really confusing behaviour, JDK 6 changed this behaviour and does consider it correct to annotate a method you implement from an interface with #Override.
The annotation is quite valuable in that it will make it crystal clear that the new method does or does not override a method of a parent class. For example, you might might think you're overriding, but you've misspelled the method name (or that the overridden method's signature has changed in the meantime).
It's not useless. It helps the reader to understand the code and the writer to avoid errrors.
That said, JDK 5 and JDK 6 behave differently with #Overrides, so just remove them if they cause problems. They make absolutely no functional difference.
Compile the code against the JDK that you will deploy to.
The problem is that the annotation is valid against overriding methods from a base class and methods defined in interfaces in version 6, but only against overriding methods in version 5. Thus the #override on methods defined in an interface will cause your error in JDK 5.

Categories

Resources