2009-10-14 33 views
14

Bunları scala yorumlayıcısına yazıyorum:Int vs Integer: tür uyumsuzluğu, bulundu: Int, zorunlu: Dize

val a : Integer = 1; 
val b : Integer = a + 1; 

Ve ben şu mesajı alıyorum:

<console>:5: error: type mismatch; 
found : Int(1) 
required: String 
     val b : Integer = a +1 
          ^

Neden? Bunu Nasıl Çözebilirim? Bu sefer Java birlikte çalışabilirliği nedeniyle Integers'a ihtiyacım var.

cevap

19

Bu soru hemen hemen aynısı olup: Scala can't multiply java Doubles? - Fikir benzer olduğu gibi, hem my answer bakabilirsiniz. Eastsun zaten ima

gibi cevap JVM ilkel sistem tam sayılan temsil Scala bir yoldur scala.Int için (temelde bir int ilkel kutu) bir java.lang.Integer bir kapalı dönüştürme vardır.

implicit def javaToScalaInt(d: java.lang.Integer) = d.intValue 

Ve birlikte çalışabilirlik elde edilmiştir - Kod sadece uygun derleme verdik kestirmene! scala.Int'un kullanıldığı ve java.lang.Integer numaralı kodun kullanıldığı kod, otomatik kutulama nedeniyle gayet iyi çalışıyor gibi görünüyor. Yani şu işleri: - bu artık kullanılmamaktadır ve büyük ihtimalle Scala 2.8'de kaldırılacak gibi aslında scala.Predef.Integer için kısaltmadır michaelkebe dediği gibi

Ayrıca
def foo(d: java.lang.Integer) = println(d) 
val z: scala.Int = 1 
foo(z) 

, Integer türünü kullanmayın.

EDIT: Oops ... nedenini yanıtlamayı unuttum. Aldığınız hata, muhtemelen scala.Predef.Integer'un, a + "my String" dizgisi dizgisi, a'un int olduğu anlamına gelen Java'nın sözdizimsel şekerini taklit etmeye çalışmasıdır. Bu nedenle, scala.Predef.Integer türündeki + yönteminde, dize birleştirme (bir String türü bekleniyor) ve doğal tamsayı ilavesi yok.

- Flaviu Cipcigan

0

Her şeyden önce Integer yerine java.lang.Integer kullanmalısınız.

Şu anda neden hata oluştuğunu bilmiyorum.

a, java.lang.Integer örneğidir ve bu türde + adlı bir yönteme sahip değildir. Ayrıca, Int'a hiçbir dolaylı dönüşme yoktur.

bu deneyebilirsiniz bu çözmek için:

 
scala> val a: java.lang.Integer = 1 
a: java.lang.Integer = 1 

scala> val b: java.lang.Integer = a.intValue + 1 
b: java.lang.Integer = 2 
2
Welcome to Scala version 2.7.3.final (Java HotSpot(TM) Client VM, Java 1.6.0_16). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> implicit def javaIntToScala(n: java.lang.Integer) = n.intValue 

javaIntToScala: (java.lang.Integer)Int 

scala> val a: java.lang.Integer = 1 

a: java.lang.Integer = 1 

scala> val b: java.lang.Integer = a + 1 

b: java.lang.Integer = 2