Ich fand eine seltsame Kompilierungseinschränkung, die ich nicht erklären kann, und ich verstehe den Grund dieser Einschränkung nicht."Methode ___() in ___ ist in unzugänglicher Klasse oder Schnittstelle definiert" Kompilierungsfehler
Beispiel 1:
Betrachten Sie diese Klassen:
In package e1;
:
public class C1 {
enum E1 { A, B, C }
public E1 x;
}
In package e2;
:
import e1.C1;
public class C2 {
public String test(C1 c1) {
return c1.x.toString(); // here compilation error
}
}
Dies bewirkt, dass die folgenden Kompilierung-Fehler:
Error:(5,20) java:
toString()
injava.lang.Enum
is defined in an inaccessible class or interface
Beispiel 2:
Betrachten Sie diese Klassen:
In package i1;
:
public interface I1 {
int someMethod();
}
public class C1 {
static class I2 implements I1 {
public int someMethod() {
return 1;
}
}
public I2 x = new I2();
}
In package i2;
:
import i1.C1;
import i1.I1;
public class C2 {
public static void main(String[] args) {
C1 c1 = new C1();
System.out.println(c1.x.someMethod()); // compilation error
}
}
Dies bewirkt, dass auch den gleichen Übersetzungsfehler, aber wenn wir die Codezeile zu ändern:
System.out.println(((I1)c1.x).someMethod());
Dann ist diese kompiliert werden kann und funktioniert einwandfrei.
Also, die Frage ist:
Warum ist diese Einschränkung der Zugänglichkeit erforderlich?
Ja, ich verstehe, dass Klassen C1.E
in Beispiel-1) und C1.I2
in Beispiel-2) sind Paket privat. Aber gleichzeitig ist klar, dass niemand schwächeren Zugriffsberechtigungen für Methoden einer Basisschnittstelle zuweisen kann (I1
von Object
), so dass es immer sicher ist, ein Objekt direkt auf seine Basisschnittstelle zu werfen und Zugriff auf die eingeschränkte Methode zu erhalten.
Kann jemand den Zweck und den Grund dieser Einschränkung erklären?
UPDATE: assylias wies darauf hin, JLS §6.6.1:
A member (class, interface, field, or method) of a reference (class, interface, or array) type or a constructor of a class type is accessible only if the type is accessible...
aussieht wie dies die Einschränkung ist, aber es nicht nicht erklären, warum diese Beschränkung (in den Fällen der oben genannten Beispielen) ist benötigt ...
schreibe'Enum E1 {A, B, C} 'als' public enum E1 {A, B, C} ' –
@Andremoniy Die Antwort ist in [# 6.6.1] (http://docs.oracle. com/javase/specs/jls/se7/html/jls-6.html # jls-6.6.1) Ich glaube: * Ein Mitglied (Klasse, Schnittstelle, Feld oder Methode) einer Referenz (Klasse, Schnittstelle oder Array) type oder ein Konstruktor eines Klassentyps ist nur zugänglich ** wenn der Typ zugänglich ist ** und das Mitglied oder der Konstruktor deklariert ist, um den Zugriff zu erlauben *. – assylias
@BheshGurung Ich weiß, ich frage: Warum brauchen wir diese Einschränkung der Zugänglichkeit? – Andremoniy