2009-10-14 2 views
14

Tôi gõ này để người phiên dịch scala:Int vs Integer: loại không phù hợp, tìm thấy: Int, yêu cầu: String

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

Và tôi nhận được thông báo:

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

Tại sao? Làm sao tôi có thể giải quyết việc này? Lần này tôi cần Số nguyên do các lý do tương thích với Java.

Trả lời

19

Câu hỏi này gần như là một bản sao của: Scala can't multiply java Doubles? - bạn có thể nhìn vào my answer là tốt, như ý tưởng tương tự.

Như Eastsun đã gợi ý, câu trả lời là một ngầm chuyển đổi từ một java.lang.Integer (cơ bản là một đóng hộp int nguyên thủy) vào một scala.Int, đó là cách Scala đại diện cho JVM số nguyên nguyên thủy.

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

Và khả năng tương tác đã đạt được - mã bạn đã cho nên biên dịch tốt! Và mã sử dụng scala.Int trong đó java.lang.Integer là cần thiết dường như chỉ hoạt động tốt do tự động đóng hộp. Vì vậy, các công trình sau đây:

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

Ngoài ra, như michaelkebe nói, không sử dụng các loại Integer - mà thực chất là viết tắt cho scala.Predef.Integer vì nó bị phản đối và có lẽ hầu hết sẽ được loại bỏ trong Scala 2.8.

EDIT: Rất tiếc ... đã quên trả lời lý do. Lỗi bạn nhận được có lẽ là scala.Predef.Integer đã cố gắng bắt chước đường cú pháp của Java, trong đó a + "my String" có nghĩa là nối chuỗi, aint. Do đó, phương thức + trong loại scala.Predef.Integer chỉ thực hiện chuỗi nối (mong đợi loại String) và không thêm số nguyên tự nhiên.

- Flaviu Cipcigan

0

Trước hết, bạn nên sử dụng java.lang.Integer thay vì Integer.

Hiện tại tôi không biết tại sao lỗi xảy ra.

a là phiên bản java.lang.Integer và loại này không có phương thức có tên +. Hơn nữa, không có chuyển đổi ẩn thành Int.

Để giải quyết điều này, bạn có thể thử này:

 
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