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;
}
}
Bien sûr, l'utilisation d'une telle implémentation Java à partir de Java fonctionne bien.
java
new Desk(Desk.Color.BLUE);
Lorsqu'il est utilisé depuis Kotlin, j'obtiens une erreur de compilation.
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'
Pour résoudre ce problème (peut-être?), Une méthode statique appelée getColorEnum ()
a été préparée.
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") //un avertissement de suppression est nécessaire
Desk(Desk.getColorEnum("BLUE")) //J'ai pu mettre une instance Color dans le constructeur Desk
En regardant quel type de cas provoque une erreur
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 ne semble pas pouvoir accéder à la classe interne statique de la super classe. J'ai jeté un coup d'œil aux spécifications linguistiques sous-jacentes, mais je n'ai pas compris.
Java semble être capable de définir une classe initialement invisible comme valeur de retour.
public class Bar {
public static InternalBar getBar() {
return new InternalBar();
}
private static class InternalBar extends Bar {}
}
Bar bar = Bar.getBar(); // OK
Vous ne pouvez pas faire ça avec Kotlin.
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()
}
Le comportement du compilateur Kotlin, qui provoque une erreur lorsqu'il ne peut pas être référencé, ne correspond pas aux spécifications Java décrites ci-dessus et ne peut pas être compilé. Actuellement, il est défini sur Avertissement au lieu d'Erreur de compilation, mais il sera correctement accessible à l'avenir. Il semble qu'il sera à nouveau modifié pour que ce ne soit une erreur de compilation que lorsque ce n'est pas possible.
Voir https://youtrack.jetbrains.com/issue/KT-11398.
Vous pouvez créer votre propre méthode utilitaire en Java.
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"))
Peut être écrit. Est-ce vraiment la bonne réponse ...?
thanks!
Recommended Posts