154 votes

Pourquoi ne ' t j’ai déclarer des méthodes statiques dans une interface ?

Le sujet dit le meilleur de lui - ce qui est la raison pour le fait que des méthodes statiques ne peuvent pas être déclarées dans une interface ?

Le code ci-dessus me donne l’erreur suivante (dans Eclipse, au moins) : « modificateur illégal pour la méthode d’interface ITest.test() ; uniquement public et abstraits sont autorisées ».

86voto

James A. Rosen Points 25774

Il y a quelques questions en jeu ici. La première est la question de la déclaration d'une méthode statique sans la définir. C'est la différence entre

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

et

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

Java ne permet pas non plus, mais il pourrait permettre à la seconde. La première est impossible pour les raisons que Espo mentionne: vous ne connaissez pas la mise en œuvre de la classe est la définition correcte.

Java pourrait permettre à celle-ci, tant qu'elle traitée Interfaces de première classe Objects. Ruby Modules, qui sont à peu près équivalentes à Java Interfaces, permettent exactement que:

module Foo
  def self.bar
    ...
  end
end

44voto

Espo Points 24318

La raison pour laquelle vous ne pouvez pas avoir une méthode statique dans une interface réside dans la façon dont Java résout les références statiques. Java ne sera pas la peine de regarder pour une instance d'une classe lors de la tentative d'exécution d'une méthode statique. C'est parce que les méthodes statiques ne sont pas d'instance dépendante et peut donc être exécuté directement à partir du fichier de classe. Étant donné que toutes les méthodes d'une interface sont abstraites, la VM aurait à regarder pour une mise en oeuvre particulière de l'interface afin de trouver le code-behind de la méthode statique de sorte qu'il pourrait être exécuté. Ensuite, cela contredit la façon statique de la méthode de résolution de travaux et d'introduire une incohérence dans la langue.

18voto

Kyle Cronin Points 35834

Je vais répondre à votre question avec un exemple. Supposons que nous avons eu une classe de mathématiques avec une méthode statique à ajouter. Vous appelez cette méthode comme suit :

Si les mathématiques sont une interface au lieu d’une classe, elle ne saurait avoir aucune fonction définie. À ce titre, disant quelque chose comme Math.add (2, 3) n’a aucun sens.

11voto

Mnementh Points 19831

La raison réside dans la conception de principe, que java ne permet pas l'héritage multiple. Le problème de l'héritage multiple peut être illustré par l'exemple suivant:

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

Maintenant ce qui se passe si vous appelez C. x()? Sera A. x() ou B. x() exécutée? Toutes les langues de l'héritage multiple doit résoudre ce problème.

Les Interfaces permettent en Java une sorte de la restriction de l'héritage multiple. Pour éviter le problème ci-dessus, ils ne sont pas autorisés à avoir des méthodes. Si nous regardons le même problème avec les interfaces et les méthodes statiques:

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

Même problème ici, ce qui se passera si vous appelez C. x()?

7voto

Ryan Farley Points 7916

Méthodes statiques ne sont pas les méthodes d’instance. Il n’y a aucun contexte d’instance, donc, pour mettre en œuvre de l’interface a peu de sens.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X