2017-01-03 8 views
6

मैं एक समारोह है कि अगर null पारित हो जाता है संकलन नहीं होगा लिखने का प्रयास:'ए>: शून्य' का अर्थ?

$scala 
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_101). 
Type in expressions for evaluation. Or try :help. 

scala> :t null 
Null 

scala> def f[A >: Null](x: A):A = x 
f: [A >: Null](x: A)A 

हालांकि, यह के रूप में मैं उम्मीद काम नहीं किया:

scala> f(null) 
res1: Null = null 
+3

'शून्य 'निचला बाउंड है, इसलिए इसकी अनुमति है लेकिन शून्य की कोई उपप्रकार अनुमति नहीं है। – puhlen

+0

[स्कैला में प्रोग्रामिंग, तीसरा संस्करण] (http: //www.artima।com/shop/programming_in_scala_3ed), नोट्स: "सुपरटेप और उप प्रकार के संबंध रिफ्लेक्सिव हैं, जिसका अर्थ है कि एक प्रकार एक सुपर - प्रकार और स्वयं का एक उप प्रकार है।" –

+2

इसका मतलब है कि 'ए' दोनों शून्य या शून्य से बड़ा कुछ भी। –

उत्तर

6

जैसा कि बताया गया है, A >: NullANull के लिए अनुमति देता है, लेकिन इससे कोई फर्क नहीं पड़ता। यहां तक ​​कि A को Null का सख्त सुपरटेप होना आवश्यक था, फिर भी nullपर null 0 प्रकारों का वैध मान है (जो इस तथ्य से सीधे है कि Null उनमें से एक उप प्रकार है)।

यदि आप शून्य प्रकारों को स्वीकार नहीं करना चाहते हैं, तो A को AnyVal का उप-प्रकार होना चाहिए। ध्यान दें कि यह संदर्भ प्रकारों के किसी भी मूल्य को पारित करने से रोक देगा - न केवल null

शून्य प्रकार को स्वीकार किए बिना संदर्भ प्रकारों को स्वीकार करने का कोई तरीका नहीं है।

-1

A :> B मतलब यह है कि A एक सुपर है B का प्रकार। A >: Null इस बाध्यता का अर्थ है कि ANull का एक सुपर-प्रकार है। Nullhas दो सुपर-प्रकार Any और AnyRef

स्कैला में आप का उपयोग null उपयोग से बचने के लिए एक अच्छी तंत्र के रूप में कर सकते हैं।

आप इस बारे में क्या सोचते हैं?

1

Scala specification section 3.5.2 (conformance) राज्यों (जोर मेरा):

<: संबंध रूपों प्रकार के बीच प्री-ऑर्डर है, यानी यह सकर्मक और कर्मकर्त्ता है। कम से कम ऊपरी सीमाएं और प्रकारों के सेट के को माना जाता है कि के सापेक्ष।

तो अगर हम देखने के एक गणितीय बिंदु से प्रकार निर्माता घोषणा को देखें, हम के रूप में :< संबंध देखें:

Null <: T <: Any 

के बाद से परिभाषा से संबंध कर्मकर्त्ता है, Null <: Null संबंध में है, जो विधि में पारित करने के लिए एक मान्य मूल्य शून्य बनाता है।

जैसा कि @ sepp2k ने टिप्पणियों में और उसके जवाब में सही कहा है, A एक ऊपरी बाध्य माध्यम से बाध्य नहीं है कि Any एक वैध उम्मीदवार है, जिसका अर्थ है कि एक शून्य मूल्य वैसे भी पारित किया जा सकता है।

+0

ध्यान दें कि यह वास्तव में कोई फर्क नहीं पड़ता। यदि '<:' रिफ्लेक्सिव नहीं थे और इस प्रकार 'ए' केवल 'कोई', 'नल' जैसे सुपरर्ट टाइप हो सकता है, तो अभी भी एक वैध तर्क होगा जो किसी भी समारोह को स्वीकार करता है (या कुछ और जो नहीं है 'AnyVal')' तर्क 'को इसके तर्क के रूप में स्वीकार करता है। – sepp2k

+0

@ sepp2k मैं सहमत हूं, लेकिन मैं इस तथ्य पर जोर देना चाहता था क्योंकि केविन ने निचले बाउंड के रूप में 'नल' घोषित किया था। जोर देने के लिए एक टिप्पणी जोड़ा गया। –

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