2010-01-04 42 views

Trả lời

19

Tôi nghĩ chút xấu xí này sẽ làm việc: scala.None$.MODULE$

Không cần cho một trường hợp mới từ một None là tốt như nhau ...

10

Bạn có thể truy cập vào singleton Không dụ từ java sử dụng :

scala.None$.MODULE$ 
49

điều scala.None$.MODULE$ không phải lúc nào typecheck, ví dụ này không biên dịch:

scala.Option<String> x = scala.None$.MODULE$; 

vì javac không biết về sai khai tại chỗ Scala, vì vậy bạn sẽ có được:

J.java:3: incompatible types 
found : scala.None$ 
required: scala.Option<java.lang.String> 
    scala.Option<String> x = scala.None$.MODULE$ ; 

này biên dịch, mặc dù:

scala.Option<String> x = scala.Option.apply(null); 

vì vậy đó là một cách khác để có được một None rằng có thể sử dụng được trong nhiều tình huống hơn.

+8

Tôi thậm chí phải viết "scala.Option.apply ((String) null)" để làm cho trình biên dịch hài lòng. – Eric

+1

Cảm ơn! Điều này làm việc cho tôi, trong khi scala.None $ .MODULE $ sản xuất lỗi loại. –

1

Đối mặt với stinkfest này, cách làm việc thông thường của tôi là:

Scala:

object SomeScalaObject { 
    def it = this 
} 

Java:

doStuff(SomeScalaObject.it()); 
2

Tôi đã thấy điều này hàm tổng quát này là mạnh mẽ nhất . Bạn cần phải cung cấp tham số kiểu, nhưng các diễn viên chỉ xuất hiện một lần, đó là tốt đẹp. Một số giải pháp khác sẽ không hoạt động trong các kịch bản khác nhau, vì trình biên dịch Java của bạn có thể thông báo cho bạn.

import scala.None$; 
import scala.Option; 

public class ScalaLang { 

    public static <T> Option<T> none() { 
     return (Option<T>) None$.MODULE$; 
    } 
} 

public class ExampleUsage { 
    static { 
     //for example, with java.lang.Long 
     ScalaLang.<Long>none(); 
    } 
} 
Các vấn đề liên quan