2010-02-25 8 views
12
trait NotNull {} 

मैं देखना कैसे इस विशेषता गारंटी ले सकते हैं कि कुछ रिक्त नहीं है की कोशिश कर रहा है और मैं यह समझ नहीं कर सकते हैं:नॉटनुल विशेषता 2.8 में कैसे काम करती है और क्या कोई वास्तव में इसका उपयोग करता है?

def main(args: Array[String]) { 
    val i = List(1, 2) 
    foo(i) //(*) 
} 

def foo(a: Any) = println(a.hashCode) 

def foo(@NotNull a: Any) = println(a.hashCode) //compile error: trait NotNull is abstract 

def foo(a: Any with NotNull) = println(a.hashCode) //compile error: type mismatch at (*) 

और:

val i = new Object with NotNull //compile-error illegal inheritance 

वहाँ जाहिर है कुछ विशेष कंपाइलर उपचार चल रहा है क्योंकि यह संकलित करता है:

trait MyTrait {} 

def main(args: Array[String]) { 
    val i: MyTrait = null 
    println(i) 
} 

जबकि यह करता है नहीं es:

def main(args: Array[String]) { 
    val i: NotNull = null //compile error: found Null(null) required NotNull 
    println(i) 
} 

संपादित करें:वहाँ मैं स्काला में प्रोग्रामिंग में मिल सकता है इस बारे में कुछ नहीं

+0

वैल ए: नोटनुल = "asdf"। 2.7.5 कंपाइलर को क्रैश करता है: थ्रेड "अपवाद" में अपवाद java.lang.AssertionError: दावा विफल: प्रकार erro r: इकाई में संदर्भ (java.lang.String) से संदर्भ (scala.NotNull) में कनवर्ट नहीं कर सकता

+2

'NotNull' वास्तव में अभी तक काम नहीं करता है। जहां तक ​​मुझे पता है, यह प्रगति पर है, स्कैला 2.7 में 'मेनिफेस्ट' की तरह। –

+1

@Daniel - ठीक है, यह दस्तावेज़ों के अनुसार 2.5 में से भाषा में रहा है, इसलिए मुझे लगता है कि इसे अभी तक काम करना चाहिए या बस हटा दिया जाना चाहिए! –

उत्तर

5

कोशिश और त्रुटि है:

scala> class A extends NotNull 
defined class A 

scala> val a : A = null 
<console>:5: error: type mismatch; 
found : Null(null) 
required: A 
     val a : A = null 
       ^

scala> class B 
defined class B 

scala> val b : B = null 
b: B = null 

यह केवल स्काला 2.7.5 के साथ काम करता :

scala> new Object with NotNull 
res1: java.lang.Object with NotNull = [email protected] 

scala> val i = new Object with NotNull 
i: java.lang.Object with NotNull = [email protected] 

ए और स्कैला भाषा संदर्भ:

If that member has a type which conforms to scala.NotNull, the member’s valuemust be initialized to a value different from null, otherwise a scala.UnitializedError is thrown.

For every class type T such that T <: scala.AnyRef and not T <: scala.NotNull one has scala.Null <: T.

+2

इसके लिए अनुशासनिक है। स्कैला की अपनी कक्षाएं क्यों (जैसे 'सूची' 'NotNull' विशेषता का विस्तार नहीं करती है? –

+0

और दूसरा प्रश्न," क्या आप इस विशेषता का उपयोग करते हैं? " –

+0

यदि आप जावा (और अन्य भाषाओं) में स्कैला लक्षणों को कार्यान्वित कर रहे हैं NotNull विशेषता को नजरअंदाज कर दिया जाएगा। एक और पहलू यह है कि @NotNull एनोटेशन और स्थिर कोड विश्लेषण जावा 7 में होगा। स्कैला libs में इसका उपयोग न करने के अन्य कारणों को न देखें। –

19

NotNull अभी तक समाप्त नहीं हुआ है। इसका इरादा गैर-शून्यता की जांच करने के लिए एक उपयोगी तरीके से विकसित करना है, लेकिन यह अभी तक नहीं है। इस पल के लिए मैं इसका इस्तेमाल नहीं करूंगा। जब यह किया जाएगा, तो मेरे पास कोई ठोस भविष्यवाणियां नहीं हैं, केवल यह 2.8.0 तक नहीं पहुंच जाएगी।

+6

क्या मैं यह कह रहा हूं कि यह 2.5 से लाइब्रेरी/भाषा में रहा है? यह अच्छी तरह से प्रतिबिंबित नहीं करता है कि स्कैला में ऐसी विशेषताएं हैं जो अभी काम नहीं करती हैं। –

+1

क्या यह स्कैला 2.9.1 में प्रयोग योग्य है ? – Freewind

संबंधित मुद्दे