lỗi biên dịch là xuất phát từ java, và Kotlin object
s chuyển sang java class
es như sau:
public final class SomeObjectA {
private SomeObjectA() {/**/}
public static final SomeObjectA INSTANCE = new SomeObjectA();
public static final class SomeObjectB {
private SomeObjectB() {/**/}
public static final SomeObjectB INSTANCE = new SomeObjectB();
}
}
SomeObjectA.SomeObjectB
được biên dịch sang mã java như sau:
SomeObjectA.SomeObjectB.INSTANCE;
SomeObjectA
là được biên dịch sang mã java như sau:
SomeObjectA.INSTANCE
chúng ta biết kotlin dựa trên java, và java không cho phép truy cập các lớp lồng nhau thông qua tham chiếu cá thể, nếu bạn thực hiện trình biên dịch sẽ báo lỗi: "Lỗi: java: loại không mong muốn": class, package found: variable", ví dụ:
SomeObjectA a = SomeObjectA.INSTANCE;
SomeObjectB b = a.SomeObjectB.INSTANCE;// error
// ^--- compiler don't know where to go? package&class or variable?
mã dưới đây, trình biên dịch Kotlin sẽ biến đổi trình biên dịch lỗi java như: "lỗi: Kotlin: đối tượng lồng nhau 'SomeObjectB' truy cập thông qua ví dụ tham khảo".
val a = SomeObjectA;
val b = a.SomeObjectB;
// ^--- Error
Type aliases do not introduce new types. They are equivalent to the corresponding underlying types.
nên hai câu lệnh dưới đây là bình đẳng:
val a = SomeObjectA;
typealias a2 = SomeObjectA;
tránh việc sử dụng các typealias
gây ra lỗi biên dịch không cần thiết, Kotlin không bao gồm tất cả các lớp lồng nhau trong typealias
.
Nguồn
2017-06-13 16:07:44
Sự cố tương tự: https://youtrack.jetbrains.com/issue/KT-12632 –