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'
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
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.
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()
}
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.
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