Java-Code, der nicht von Kotlin verwendet werden kann (für interne Lernsitzungen)


Code, auf den ich mich wirklich einließ

Desk.java


package library_package;

abstract class BaseDesk {
    public enum Color { BLUE, ORANGE }
}

public class Desk extends BaseDesk {
    private Color color;

    public Desk(Color color) {
        this.color = color;
    }
}

Natürlich funktioniert die Verwendung einer solchen Java-Implementierung aus Java gut.

java


new Desk(Desk.Color.BLUE);

Bei Verwendung von Kotlin wird ein Kompilierungsfehler angezeigt.

kotlin


Desk(Desk.Color.BLUE) // Unresolved reference: Color

kotlin


import library_package.BaseDesk // Cannot access 'BaseDesk': it is package-private in 'library_package'

Desk(BaseDesk.Color.BLUE) // Cannot access 'Color': it is public in 'BaseDesk'

Wie vermeide ich?

Um dieses Problem zu lösen (vielleicht?), Wurde eine statische Methode namens "getColorEnum ()" vorbereitet.

Desk.java


package library_package;

abstract class BaseDesk {
    public enum Color { BLUE, ORANGE }

    public static Color getColorEnum(String name) {
        return Color.valueOf(name);
    }
}

kotlin


@Suppress("INACCESSIBLE_TYPE") //Warnung unterdrücken ist notwendig
Desk(Desk.getColorEnum("BLUE")) //Ich konnte eine Color-Instanz in den Desk-Konstruktor einfügen

Warum bekomme ich einen Fehler / nicht?

Schauen Sie sich an, welche Art von Fall einen Fehler verursacht ...

Foo.java


class BaseFoo {
    public static int i = 0;

    public static int inc() {
        return ++i;
    }

    public static class FooFoo {
        public static int j = 0;
    }
}

public class Foo extends BaseFoo {}

java


int foo_i = Foo.i;
int foo_inc = Foo.inc();
int foo_foo_j = Foo.FooFoo.j;

kotlin


val foo_i = Foo.i
val foo_inc = Foo.inc()
val foo_foo_j: Int = Foo.FooFoo.j // Unresolved reference: FooFoo

Kotlin scheint nicht in der Lage zu sein, auf die statische innere Klasse der Superklasse zuzugreifen. Ich habe mir die zugrunde liegenden Sprachspezifikationen kurz angesehen, aber nicht verstanden.


Warum kann es als Methodenrückgabewert verwendet werden?

Java scheint in der Lage zu sein, eine ursprünglich unsichtbare Klasse als Rückgabewert zu definieren.

public class Bar {
    public static InternalBar getBar() {
        return new InternalBar();
    }

    private static class InternalBar extends Bar {}
}

Bar bar = Bar.getBar(); // OK

Mit Kotlin geht das nicht.

open class Baz {
    companion object {
        fun getInternalBaz(): InternalBaz { // 'public' function exposes its 'private' return type InternalBaz
            return InternalBaz()
        }

        fun getBaz(): Baz { // OK
            return InternalBaz()
        }
    }
    private class InternalBaz : Baz()
}

Was ist die Warnung INACCESSIBLE_TYPE?

Es besteht das Problem, dass das Verhalten des Kotlin Compilers, das einen Fehler verursacht, wenn nicht darauf verwiesen werden kann, nicht mit den oben beschriebenen Java-Spezifikationen übereinstimmt und nicht kompiliert werden kann. Derzeit ist Warning anstelle von Compile Error festgelegt, aber in Zukunft wird ordnungsgemäß darauf zugegriffen. Es scheint, dass es erneut geändert wird, so dass es nur dann zu einem Kompilierungsfehler kommt, wenn dies nicht möglich ist.

Siehe https://youtrack.jetbrains.com/issue/KT-11398.


Was ist, wenn getColorEnum () auf der Bibliotheksseite nicht bereitgestellt wird?

Sie können Ihre eigene Dienstprogrammmethode in Java erstellen.

DeskColorResolver.java


import library_package.Desk;

public class DeskColorResolver {
    public static Desk.Color getColor(String name) {
        return Desk.Color.valueOf(name);
    }
}

kotlin


val desk = Desk(DeskColorResolver.getColorEnum("BLUE"))

Kann geschrieben werden. Ist das wirklich die richtige Antwort ...?


thanks!

Recommended Posts

Java-Code, der nicht von Kotlin verwendet werden kann (für interne Lernsitzungen)
Java 14 neue Funktionen, mit denen Code geschrieben werden kann
Beachten Sie, dass Systemeigenschaften einschließlich JAXBContext in Java11 nicht verwendet werden können
Memo für die Migration von Java nach Kotlin
[Java] Variablen, die innerhalb der `for-Anweisung` deklariert sind, können nicht außerhalb des` for-Anweisungsblocks` verwendet werden
Technologie-Auszug, mit dem EC-Sites in Java-Schulungen erstellt werden können
[Java] Szenen, die nicht neu zugewiesen werden können (im Wesentlichen endgültig)
Für Java-Ingenieure, die ab sofort Kotlin starten
Warum der Klassenvergleich vom Typ Java String (==) nicht verwendet werden kann
Überprüfen Sie mit Java / Kotlin, ob Dateien unter Windows nicht in die Benutzerkontensteuerung geschrieben werden können
Die geänderte Funktion von kotlin kann nicht von Java aus aufgerufen werden.
Bitte beachten Sie, dass Spring Boot + Tomcat 8.5.8 nicht verwendet werden kann!
Probleme, die leicht mit Java und JavaScript verwechselt werden können
Tools und Befehle, die für die Fehlerbehebung in Java hilfreich sein können
Weil getSupportLoaderManager nicht verwendet werden kann
Bücher zum Erlernen von Java
Java Stream kann nicht wiederverwendet werden.
Statisches Analysetool, das mit GitHub verwendet werden kann [Java-Version]
Zusammenfassung von ORM "uroboroSQL", das in Enterprise Java verwendet werden kann
[Java] Geschützte Methoden können nicht immer innerhalb einer Unterklasse aufgerufen werden