2012-01-30 48 views
17

Ben scala aşağıdaki örtük dönüştürme yazın:Bu tür örtük dönüştürme neden yasa dışı?

implicit def strToInt2(str: String):Int = { 
    str.toInt 
    } 

Ama bu derleme hatası yükselir: Ben dönüş türü kaldırırsanız

<console>:9: error: type mismatch; 
found : str.type (with underlying type String) 
required: ?{val toInt: ?} 
Note that implicit conversions are not applicable because they are ambiguous: 
both method augmentString in object Predef of type (x: String)scala.collection. 
immutable.StringOps 
and method toi in object $iw of type (str: String)Int 
are possible conversion functions from str.type to ?{val toInt: ?} 
      str.toInt 
     ^

, sadece bu gibi beyan:

implicit def strToInt2(str: String) = { 
    str.toInt 
    } 

Başarılı bir şekilde derler. Kimse bana ikisi arasındaki farkın ne olduğunu söyleyebilir mi?

+0

Kesin cevabı bilmiyorum, ama sanırım Predef'de bir örtük dönüştürme dizesi var. Bu yüzden, bu türlerin yeni dönüşümünü eklemek bazı şeyleri belirsizleştirir. – dmitry

cevap

17

Tamam, en baştan başlayalım, neden ilk durumda başarısız oluyor:

  1. Bir Int içine String dönüştüren bir örtülü yöntemi tanımlamak ve böylece toInt çağrı yapmaya çalışıyoruz.
  2. Ne yazık ki, toIntString sınıfının bir parçası değildir. Bu nedenle, derleyicinin str'u toInt:Int yöntemine sahip bir öğeye dönüştürmek için bir örtük bulması gerekir. Neyse ki, Predef.augmentString, String'u bir StringOps'a dönüştürür. Böyle bir yönteme sahip olan, .
  3. Ancak Int türünde böyle bir yöntem vardır ve AS bir dönüş türü tanımlarsınız, yöntem strToInt2 yinelemeli olarak çağrılabilir ve yöntem örtülü olduğu için, toInt:Int işleviyle bir şeyi dönüştürmek için uygulanabilir.
  4. derleyici size dönüş türü ihmal gibi strToInt2 işlev özyinelemeli olamaz. Sizindir ve Predef.augmentString ve bir hata atar arasındaki (kullanmak örtülü hangi yöntemi İkinci durumda

biliyorum ve yok . "2".toInt, hata geri döndü:. Eğer şimdi bir String varken bir toInt:Int fonksiyonu ile bir şeyler elde etmek için iki yol vardır

String

ANCAK bu tanım sonra Denersen

dönüştürmek için iki aday artık vardır
İlgili konular