2016-03-18 3 views
2

Le ExtendedDismaxQParser de classe a une clause de classe membre statique:Accès membre protégé de la classe statique dans la sous-classe du parent

public class ExtendedDismaxQParser { 
    protected static Class Clause { 
     protected String foo, bar; 
    } 
    public Clause getAClause { 
     Clause c; 
     // misc code that isn't important 
     return c; 
    } 
} 

Je puis étendu cette classe dans un package différent:

public class SpecialDismaxQParser extends ExtendedDismaxQParser { 
    public void whatever() { 
     Clause c = super.getAClause(); 
     boolean baz = c.foo.equals("foobar"); // <-- This doesn't compile 
    } 
} 

Il semble Comme si vous ne pouviez pas accéder à la variable membre foo, malgré le fait que la classe Clause est protégée et que la variable membre foo est également protégée. Je veux juste être en mesure de vérifier quelque chose à propos de la variable membre foo de la clause de classe statique protégée. Comment puis-je faire cela (de préférence sans réflexion)?

Je préférerais de beaucoup ne pas avoir à modifier la classe parente parce qu'elle fait partie d'une bibliothèque.

+0

En effet, l'article n'est pas la classe d'être étendue. Voici un bon tableau de référence: http://stackoverflow.com/a/33627846/276052 – aioobe

+0

Jetez un oeil à http://stackoverflow.com/questions/14534421/java-extending-inner-classes. – bradimus

+0

J'avais écrit une réponse, mais mon internet s'est déclenché et il semble avoir été supprimé. Fondamentalement, faites les champs 'public', car ils ne sont actuellement visibles que pour les sous-classes de la classe interne (et ailleurs dans le même paquet). – bcsb1001

Répondre

-2

Les modificateurs d'accès protégés permettent d'accéder aux variables et aux méthodes dans le package uniquement. Vous avez créé votre classe dans le package de votre classe Clause.

La réflexion ne vous fera aucun bien ici.

+0

Ne le mélangez-vous pas avec un accès privé? – aioobe

+0

Il suffit de google Modificateurs d'accès Java avant le vote – rahsan

+0

@rahsan Just modificateurs d'accès Google Java avant de poster une réponse incorrecte. L'accès 'protected' s'applique également aux sous-classes. – bcsb1001

1

Le commentaire de aioobe est correct. Le partage d'une superclasse avec la classe externe n'est pas suffisant pour accéder aux membres protégés de la classe interne statique.

La classe de l'appelant ne s'étend pas à Clause et se trouve dans un package différent. Pour que protected soit pertinent, vous devez accéder à foo depuis une sous-classe de Clause, ou y accéder depuis une classe du même package que ExtendedDismaxQParser.

0

Comme déjà dit dans les commentaires et très bien expliqué dans la réponse de @Nathan Hughes, vous ne pouvez pas accéder au champ protected dans Clause car ce n'est pas la classe en cours d'extension.

La seule façon d'accéder à ce domaine est malheureusement par la réflexion

public class SpecialDismaxQParser extends ExtendedDismaxQParser { 
    public void whatever() { 
     try { 
      Field fooField = Clause.class.getDeclaredField("foo"); 
      fooField.setAccessible(true); 
      Clause c = super.getAClause(); 
      boolean baz = fooField.get(c).equals("foobar"); 
     } catch (NoSuchFieldException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
    } 
}