2015-01-31 5 views
6

मैं हमेशा कई स्तरों से अधिक अंतर्निहित रूपांतरण लगाना था स्केला में संभव नहीं है (जब तक आप दृश्य सीमा निर्धारित करें: http://docs.scala-lang.org/tutorials/FAQ/context-and-view-bounds.html)कई स्तरों पर निहित रूपांतरण, स्वचालित रूप से काम करने के लिए int क्यों काम करता है?

लेकिन ऐसा लगता है प्रकार प्रणाली या कोई विसंगति में एक दोष नहीं है। एक उदाहरण (How can I chain implicits in Scala? से अनुकूलित)

class A(val n: Double){ 
    def total = n + 10 
} 

object T1{ 
    implicit def toA(n: Double): A = new A(n) 
    val i : Int = 5 
    println(i.total) //Why does this work? 
    println(5.2.total) 
} 

मैं सच में समझ में नहीं आता क्यों इंट से अंतर्निहित रूपांतरण के बाद -> डबल -> एक काम करता है। क्या कोई कारण बता सकता है? धन्यवाद

+5

रूपांतरणों को चौड़ा करना अलग-अलग रूपांतरणों से अलग है: https://developmentality.wordpress.com/2011/01/24/scala-type-inferencing-gotchas/ –

+0

भाषा संदर्भ में कमजोर अनुरूपता समझने में मदद कर सकती है (ये अंतर्निहित नहीं हैं रूपांतरण): http://www.scala-lang.org/files/archive/spec/2.11/03-types.html#weak-conformance और यह प्रश्न: http://stackoverflow.com/q/3094380 –

उत्तर

1

जैसा कि गैबर ने पहले ही टिप्पणी की है, यह due to numeric widening है। यदि आप -print विकल्प के साथ भागते हैं, तो आप देखेंगे कि .toDoublei में जोड़ा गया है, जो उसके बाद इसे toAimplicit का उपयोग करने की अनुमति देता है। आप warn-numeric-widen साथ scalac चला सकते हैं और इस पर कम से कम आप निम्नलिखित दे देंगे:

<console>:14: warning: implicit numeric widening 
    println(i.total) //Why does this work? 
      ^
4

यह एक अलग तंत्र, आंकिक प्रकार के लिए अद्वितीय के माध्यम से होता है, सांख्यिक चौड़ा करने कहा जाता है।

SLS 6.26.1 Value Conversions का कहना है:

निम्नलिखित पांच अंतर्निहित रूपांतरण एक अभिव्यक्ति जो कुछ मान प्रकार टी है और जो कुछ अपेक्षित प्रकार pt साथ टाइप-चेक किया गया है के लिए लागू किया जा सकता है।

स्टेटिक ओवरलोडिंग संकल्प

प्रकार आरंभ होने

संख्यात्मक चौड़ा

संख्यात्मक शाब्दिक संकुचन

मूल्य को छोड़ने से

देखें आवेदन

गतिशील सदस्य Selec tion

(ठीक है, कि पांच से अधिक है .... यकीन नहीं क्यों :)

ब्याज में से एक संख्यात्मक चौड़ा है:

तो एक आदिम संख्या प्रकार है अपेक्षित प्रकार के लिए weakly conforms, यह संख्यात्मक रूपांतरण विधियों में से एक का उपयोग करके अपेक्षित प्रकार तक बढ़ाया गया है toShort, toChar, toInt, toLong, toFloat, toDouble परिभाषित here

3.5.16 Weak Conformance कहते

कुछ स्थितियों में स्काला एक अधिक सामान्य अनुरूपता संबंध का उपयोग करता है। एक प्रकार एस कमजोर रूप से एक प्रकार टी के अनुरूप होता है, लिखित एस <: डब्ल्यूटी, यदि एस <: टी या दोनों एस और टी आदिम संख्या प्रकार हैं और एस निम्नलिखित क्रम में टी से पहले है।

Byte <:w Short 
Short <:w Int 
Char <:w Int 
Int <:w Long 
Long <:w Float 
Float <:w Double 

तो println(i.total)println(i.total.toFloat) क्योंकि Int <:w <: Long <: Float हो जाता है।

जावा (और सी # और कई अन्य भाषाओं) में संख्यात्मक चौड़ाई है, और स्कैला ने इसे रखने का फैसला किया।

ध्यान दें कि रिवर्स काम नहीं करता है: Float को इस तरह से Int में पूरी तरह से परिवर्तित नहीं किया जा सकता है, क्योंकि आयाम खो जा सकता है; यह एक "चौड़ा" नहीं है।

आप -Ywarn-numeric-widen जोड़ सकते हैं और ऐसा होने पर चेतावनी प्राप्त कर सकते हैं।

+0

कम से कम अब यह पहले से ही सही है: 'निम्नलिखित सात अंतर्निहित रूपांतरण' (...) – pedrorijo91

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