2010-09-12 18 views
4

Ceci est en relation avec final interface in java. Parmi les discussions il y avait que le concept de final par rapport aux interfaces est ambigu. Est-ce qu'une interface finale signifierait qu'elle ne peut pas avoir de sous-interfaces? Cela voudrait-il dire qu'il ne peut pas avoir des implémentations?Pouvez-vous écrire une interface qui ne peut pas être implémentée?

Cette question est la première: pouvez-vous écrire une interface finale telle que le compilateur vous empêchera de l'implémenter?

Répondre

4

Comme je le montrerai, il est possible d'implémenter l'interface ci-dessus en utilisant un proxy. La question la plus significative est, pourquoi essaieriez-vous de faire une interface non implémentable? Même en tant que point philosophique, il semble plutôt superficiel.

import java.lang.reflect.Proxy; 
import java.lang.reflect.InvocationHandler; 
import java.lang.reflect.Method; 

class NoFinal 
{ 
    public static void main(String[] a) throws Throwable 
    { 
     FinalInterface o = (FinalInterface) Proxy.newProxyInstance(FinalInterface.class.getClassLoader(), new Class[]{FinalInterface.class}, new InvocationHandler() 
     { 
      public Object invoke(Object proxy, Method method, Object[] args) 
      { 
       System.out.println(method); 
       return null; 
      } 
     }); 
     Method[] methods = FinalInterface.class.getDeclaredMethods(); 
     methods[0].invoke(o, new Object[]{null}); 
     methods[1].invoke(o, new Object[]{null}); 
    } 
} 

Cela ne donnera pas une erreur lors de la compilation ou de l'exécution, et il montre que vous pouvez faire une véritable instance de cette interface avec les deux méthodes appelables.

+0

Je vois en utilisant la réflexion, il est possible d'implémenter n'importe quelle interface. – emory

2

Je propose ce qui suit en tant qu'interface, de sorte que l'implémentation sera évitée lors de la compilation.

interface FinalInterface 
{ 
    class Types 
    { 
     private class Alpha { } 

     private class Beta { } 
    } 

    void method (Types . Alpha param) ; 

    void method (Types . Beta param) ; 
} 
+0

Ceci est incorrect, comme indiqué dans ma réponse. –

+1

Pourquoi répondre à votre question, et immédiatement? –

+0

@ Thorbjørn Ravn Andersen b/c J'étais curieux de savoir si mon interface FinalInterface pouvait être implémentée. – emory

1

Techniquement, vous pouvez, en spécifiant des paramètres qui ne sont pas accessibles à implementors - par exemple dans le même paquet que l'interface, avec la visibilité du paquet-privé.

Mais cela n'a aucun sens. Cette interface est complètement inutile dans ce cas.

Mise à jour: Une utilisation me vient à l'esprit, mais cela ne devrait pas être fait. Si vous voulez utiliser des interfaces pour les définitions constantes, afin d'épargner le tas de modificateur qu'une interface assume, mais vous ne voulez pas utiliser l'anti-pattern de l'implémentation d'une interface constantes uniquement.

+0

Fait intéressant, C# empêche une telle interface au moment de la compilation, avec une erreur "incohérence d'accessibilité". –

+0

@Jon Skeet - et que se passe-t-il si l'interface est également déclarée paquet-privée? Je suppose que l'erreur n'apparaît pas alors. – Bozho

+0

Yup (ou plutôt, une interface interne utilisant des types internes). D'un autre côté, lors de * l'implémentation * de cette méthode, vous devez utiliser une implémentation d'interface explicite, car sinon vous devez déclarer la méthode * implementation * comme publique, ce qui entraînerait la même erreur :( –