2010-08-24 28 views
15

Tôi có Scala (2.8) đoạn mã sau:Nested Scala độc thân từ mã Java

object A { 
    val message = "hello" 
    object B { 
    val message = "world" 
    } 
} 

Và một lớp Java tương tự:

public class C { 
    public static String message() { 
    return "HELLO"; 
    } 
    public static class D { 
    public static String message() { 
     return "WORLD"; 
    } 
    } 
} 

Những công việc như tôi mong đợi khi tôi gọi cho họ từ Scala:

scala> A.message 
res0: java.lang.String = hello 

scala> A.B.message 
res1: java.lang.String = world 

scala> C.message 
res2: java.lang.String = HELLO 

scala> C.D.message 
res3: java.lang.String = WORLD 

Nhưng khi tôi thử thứ gì đó tương tự từ Java, trình biên dịch không thích dòng thứ hai:

System.out.println(A.message()); 
System.out.println(A.B.message()); // cannot find ... symbol : variable B ... 
System.out.println(C.message()); 
System.out.println(C.D.message()); 

Rõ ràng đây là trường hợp khi tôi xem các tệp lớp học với javap. Tôi biết tôi có thể sử dụng

System.out.println(A$B$.MODULE$.message()); 

thay vào đó, hoặc thêm một cái gì đó giống như val getB = B để đối tượng A của tôi và thay thế dòng thứ hai với

System.out.println(A.getB().message()); 

Có cách nào tiêu chuẩn để sử dụng lồng nhau Scala đối tượng singleton từ mã Java ?

+1

Vâng, 'A $ B $ .MODULE $ '_is_ một cách tiêu chuẩn, ngay cả khi nó không phải là một cách tiêu chuẩn đặc biệt tốt đẹp. –

Trả lời

0

Một cú pháp hơi khác nhau làm việc cho tôi trong Scala 2.12:

Với Scala

object A { 
    object B { 
    val message = "world" 
    } 
} 

sau đó message là thể truy cập từ Java bởi

A.B.MODULE$.message(); 
Các vấn đề liên quan