Why can't I declare static methods in an interface?
Asked Answered
R

14

154

The topic says the most of it - what is the reason for the fact that static methods can't be declared in an interface?

public interface ITest {
    public static String test();
}

The code above gives me the following error (in Eclipse, at least): "Illegal modifier for the interface method ITest.test(); only public & abstract are permitted".

Rhenium answered 22/8, 2008 at 5:16 Comment(7)
Please unaccept Espo's answer, as it is flawed. An interface has a class-file that could contain the implementation of a static method (if the Java-designer would allow this), so there is no problem in resolving the implementation of the static method. It works exactly as with other static classes.Haphazardly
i kind of agree with the answer given by "erickson" #513377Kohinoor
This will be available in Java 8 btw.Babin
@Babin Do you have any link about that? Sounds cool.Gluttonize
@Gluttonize GIYF but anyway, check hereBabin
Yeah of course I could have find it ;) But when you said something like this it's always better to give the link! Thanks.Gluttonize
Links from official documentation : Java SE tutorial & Java Language Specification 9.2Whoreson
M
86

There are a few issues at play here. The first is the issue of declaring a static method without defining it. This is the difference between

public interface Foo {
  public static int bar();
}

and

public interface Foo {
  public static int bar() {
    ...
  }
}

The first is impossible for the reasons that Espo mentions: you don't know which implementing class is the correct definition.

Java could allow the latter; and in fact, starting in Java 8, it does!

Modestamodeste answered 22/8, 2008 at 14:29 Comment(4)
Yes - it's idealogical not technical. The reason I would like it is. that one can have a static "implementation" method in an interface that only references other "interface" methods in the interface that can be easily re-used by implementing classes. But one can declare a static class in an interface so one could have such things reside there like MyInterface.Impl.doIt(MyInterface i, Object[] args) { ... }Optical
Since Java 8, you can define static methods in an interface. The methods must be public.Rolon
@OlivierGrégoire ...and they are not inherited, which is key.Extraditable
Good answer, though "approximately equivalent" ROFLMAO xD I would have put it more like "somewhat resembles".Caravan
P
45

The reason why you can't have a static method in an interface lies in the way Java resolves static references. Java will not bother looking for an instance of a class when attempting to execute a static method. This is because static methods are not instance dependent and hence can be executed straight from the class file. Given that all methods in an interface are abstract, the VM would have to look for a particular implementation of the interface in order to find the code behind the static method so that it could be executed. This then contradicts how static method resolution works and would introduce an inconsistency into the language.

Peafowl answered 22/8, 2008 at 5:20 Comment(3)
This explanation doesn't explain the problem. Every interface have it's own class-file, it could contain the static-method. So no lookup for a particular implementation would be needed.Haphazardly
Not every interface type in Java is within it's own file, nor should it be according to JLS. Additionally JLS doesn't stipulate that classes have to be always stored withing a file system, quite the contrary.Tombac
@Totophil: Interfaces must not be in a single java-file, but it will have an own class-file after compiling. That's what I wrote.Haphazardly
C
18

I'll answer your question with an example. Suppose we had a Math class with a static method add. You would call this method like so:

Math.add(2, 3);

If Math were an interface instead of a class, it could not have any defined functions. As such, saying something like Math.add(2, 3) makes no sense.

Concerning answered 22/8, 2008 at 5:19 Comment(0)
H
11

The reason lies in the design-principle, that java does not allow multiple inheritance. The problem with multiple inheritance can be illustrated by the following example:

public class A {
   public method x() {...}
}
public class B {
   public method x() {...}
}
public class C extends A, B { ... }

Now what happens if you call C.x()? Will be A.x() or B.x() executed? Every language with multiple inheritance has to solve this problem.

Interfaces allow in Java some sort of restricted multiple inheritance. To avoid the problem above, they are not allowed to have methods. If we look at the same problem with interfaces and static methods:

public interface A {
   public static method x() {...}
}
public interface B {
   public static method x() {...}
}
public class C implements A, B { ... }

Same problem here, what happen if you call C.x()?

Haphazardly answered 26/9, 2008 at 8:48 Comment(7)
Any reason for the downvote? A explaining comment would be nice.Haphazardly
i am not the downvoter, but isn't this valid for non-static methods too?Claudioclaudius
OK, here are two different possibilities. A method could be implemented or only declared. I understood, that the static method has to be implemented. In that meaning I encounter the problem presented in my answer. If you don't do that, you run into the problem Espo described - and that I didn't understand because I assumed the static method would be implemented. You also cannot declare a static abstract method for this reason, try it out, the compiler will complain.Haphazardly
Ok, forget the implementation part. the question is why cant we declare. yes the compiler will complain and why is that is the question. to which I dont think you have answered.Claudioclaudius
How would the situation there be any worse than having interface A contain int x(int z); and interface B contain string x(int x);? What is the meaning of x(3) in interface C?Gurnard
I am not sure i agree with the exact wording, but the answer does make sense in explaining why static methods in Interface should not be allowed.Ackler
But static fields are allowed. I could define an A.x and a B.x on your interfaces. And in that case trying to refer to (an ambiguous) C.x causes a compile-time error. Couldn't the same thing be done for static methods? (Is that the plan in Java 8?)Christiniachristis
T
7

Static methods are not instance methods. There's no instance context, therefore to implement it from the interface makes little sense.

Tarpaulin answered 22/8, 2008 at 5:18 Comment(0)
A
6

Now Java8 allows us to define even Static Methods in Interface.

interface X {
    static void foo() {
       System.out.println("foo");
    }
}

class Y implements X {
    //...
}

public class Z {
   public static void main(String[] args) {
      X.foo();
      // Y.foo(); // won't compile because foo() is a Static Method of X and not Y
   }
}

Note: Methods in Interface are still public abstract by default if we don't explicitly use the keywords default/static to make them Default methods and Static methods resp.

Adair answered 28/3, 2014 at 11:19 Comment(0)
P
4

There's a very nice and concise answer to your question here. (It struck me as such a nicely straightforward way of explaining it that I want to link it from here.)

Persons answered 6/2, 2009 at 12:19 Comment(1)
This is not an answer to the question, at best it should be a comment.Competence
D
3

It seems the static method in the interface might be supported in Java 8, well, my solution is just define them in the inner class.

interface Foo {
    // ...
    class fn {
        public static void func1(...) {
            // ...
        }
    }
}

The same technique can also be used in annotations:

public @interface Foo {
    String value();

    class fn {
        public static String getValue(Object obj) {
            Foo foo = obj.getClass().getAnnotation(Foo.class);
            return foo == null ? null : foo.value();
        }
    }
}

The inner class should always be accessed in the form of Interface.fn... instead of Class.fn..., then, you can get rid of ambiguous problem.

Decastro answered 17/9, 2013 at 4:9 Comment(0)
M
2

An interface is used for polymorphism, which applies to Objects, not types. Therefore (as already noted) it makes no sense to have an static interface member.

Margravine answered 22/8, 2008 at 5:27 Comment(1)
In some reflective contexts is almost seems to make sense thoughServomechanical
H
1

Java 8 Had changed the world you can have static methods in interface but it forces you to provide implementation for that.

public interface StaticMethodInterface {
public static int testStaticMethod() {
    return 0;
}

/**
 * Illegal combination of modifiers for the interface method
 * testStaticMethod; only one of abstract, default, or static permitted
 * 
 * @param i
 * @return
 */
// public static abstract int testStaticMethod(float i);

default int testNonStaticMethod() {
    return 1;
}

/**
 * Without implementation.
 * 
 * @param i
 * @return
 */
int testNonStaticMethod(float i);

}

Huppah answered 5/2, 2016 at 9:49 Comment(0)
D
0

Illegal combination of modifiers : static and abstract

If a member of a class is declared as static, it can be used with its class name which is confined to that class, without creating an object.

If a member of a class is declared as abstract, you need to declare the class as abstract and you need to provide the implementation of the abstract member in its inherited class (Sub-Class).

You need to provide an implementation to the abstract member of a class in sub-class where you are going to change the behaviour of static method, also declared as abstract which is a confined to the base class, which is not correct

Dispersant answered 2/10, 2013 at 10:32 Comment(1)
How does this answer the question? The OP asked about interface while you wrote about class.Secondrate
A
0

Since static methods can not be inherited . So no use placing it in the interface. Interface is basically a contract which all its subscribers have to follow . Placing a static method in interface will force the subscribers to implement it . which now becomes contradictory to the fact that static methods can not be inherited .

Aurel answered 15/12, 2013 at 5:0 Comment(1)
static methods are always inherited but they can't be overridden.Tehee
D
0

With Java 8, interfaces can now have static methods.

For example, Comparator has a static naturalOrder() method.

The requirement that interfaces cannot have implementations has also been relaxed. Interfaces can now declare "default" method implementations, which are like normal implementations with one exception: if you inherit both a default implementation from an interface and a normal implementation from a superclass, the superclass's implementation will always take priority.

Dovev answered 21/2, 2019 at 11:20 Comment(3)
OMG! We have a serious programmer(and me,commenter) answering(and me,commenting) 10 year old question.Olein
I didn't notice the date :)Dovev
Haha! No problem!Olein
C
-2

Perhaps a code example would help, I'm going to use C#, but you should be able to follow along.

Lets pretend we have an interface called IPayable

public interface IPayable
{
    public Pay(double amount);
}

Now, we have two concrete classes that implement this interface:

public class BusinessAccount : IPayable
{
    public void Pay(double amount)
    {
        //Logic
    }
}

public class CustomerAccount : IPayable
{
    public void Pay(double amount)
    {
        //Logic
    }
}

Now, lets pretend we have a collection of various accounts, to do this we will use a generic list of the type IPayable

List<IPayable> accountsToPay = new List<IPayable>();
accountsToPay.add(new CustomerAccount());
accountsToPay.add(new BusinessAccount());

Now, we want to pay $50.00 to all those accounts:

foreach (IPayable account in accountsToPay)
{
    account.Pay(50.00);
}

So now you see how interfaces are incredibly useful.

They are used on instantiated objects only. Not on static classes.

If you had made pay static, when looping through the IPayable's in accountsToPay there would be no way to figure out if it should call pay on BusinessAcount or CustomerAccount.

Culminate answered 22/8, 2008 at 5:35 Comment(1)
Just because static methods make no sense in THIS example, does not mean that they don't make sense in ANY example. In your example if the IPayable interface had static method "IncrementPayables" that kept track of how many payables were added, this would be a real use case. Of course, one could always use an abstract class, but that's not what you addressed. Your example in itself does not undermine static methods in interfaces.Servomechanical

© 2022 - 2024 — McMap. All rights reserved.