2017-06-09 19 views
14

Xét đoạn mã sau:Tại sao tôi không thể tham chiếu đến một đối tượng lồng nhau từ val hoặc typealias đề cập đến một đối tượng?

object SomeObjectA { 
    object SomeObjectB { 
     val a = "test" 
    } 
} 

val X = SomeObjectA 
typealias Y = SomeObjectA 

SomeObjectA.SomeObjectB // works 
X.SomeObjectB // error 
Y.SomeObjectB // error 

tôi không thể đề cập đến một đối tượng lồng nhau (trong một đối tượng bên ngoài) sử dụng val hoặc typealias được đề cập đến các đối tượng bên ngoài. Tại sao?

+0

Sự cố tương tự: https://youtrack.jetbrains.com/issue/KT-12632 –

Trả lời

7

Điều bạn mô tả xảy ra vì SomeObjectA trong ví dụ của bạn đồng thời là tên của đối tượng tên của lớp học.

Vì vậy, để truy cập SomeObjectB, bạn cần sử dụng cú pháp <classname>.<classname>. Đó là lý do tại sao X.SomeObjectB không biên dịch (<object>.<classname> không được hỗ trợ)

P.S. Điều này không thực sự giải thích vấn đề thứ hai của bạn với typealias. Nó trông giống như một lỗi với tôi, nhưng tôi không chắc chắn.

3

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.

Các vấn đề liên quan