2012-01-31 34 views
11

Trong khi cố gắng để làm một bản đồ trong Scala, tôi nhận được thông báo lỗi sau: đối tượng Map không phải là một giá trịObject không phải là một lỗi giá trị trong scala

Mã Tôi đang sử dụng như sau:

val myStringMap = Map[String, String]("first" -> "A", "second" -> "B", "third" -> "C") 

Tôi khá bối rối về lý do tại sao tôi không thể tạo bản đồ này vì sau khi xem tài liệu Scala, có vẻ như cú pháp của mã của tôi là đúng.

+1

Nếu tôi bắt đầu REPL và dán mã này, nó hoạt động tốt; rằng nó không cho bạn đề nghị một cái gì đó về phần còn lại của thiết lập của bạn. Phiên bản Scala nào bạn đang chạy, loại nhập khẩu nào bạn có ... Thứ gì đó trong ngữ cảnh có khả năng che giấu việc nhập chuẩn của 'Bản đồ' và gây ra vấn đề này. – Submonoid

+0

Phiên bản scala nào? Làm việc cho tôi trong REPL: 'myStringMap: scala.collection.immutable.Map [String, String] = Bản đồ (đầu tiên -> A, thứ hai -> B, thứ ba -> C)' trong 2.9.0.1 –

+0

giống nhau, tốt trong REPL – virtualeyes

Trả lời

17

Khi bạn thấy lỗi "đối tượng không phải là một giá trị" này thường có nghĩa là loại trong phạm vi là một loại Java - bạn có thể được nhập khẩu java.util.Map trong phạm vi

scala> Map(1 -> "one") 
res0: scala.collection.immutable.Map[Int,java.lang.String] = Map(1 -> one) 

Nhưng

scala> import java.util.Map 
import java.util.Map 

scala> Map(1 -> "one") 
<console>:9: error: object Map is not a value 
       Map(1 -> "one") 
      ^

Hãy nhớ rằng, trong scala mỗi lớp đi kèm với một (tùy chọn) đối tượng đồng hành là một giá trị. Điều này không đúng với các lớp Java.

+1

Giả sử tôi không che giấu một lớp nội trang nhưng cố gắng sử dụng một Lớp Java. Tôi nên làm gì để có được * đối tượng đồng hành * ?. – tutuca

+7

Tôi không hiểu giải pháp. Vì vậy, làm thế nào để sửa chữa nó? :) –

1

Tôi gặp lỗi tương tự trên Danh sách. thử điều này trong scala console:

import java.util.List object test { def a():List[String] = { val list = List[String](); null }}

bạn sẽ nhận được err "Object List is not a value."

Bạn nhận được nó bởi vì bạn đang che giấu được xây dựng trong Danh sách loại, đó là bởi vì Danh sách là khác nhau từ java. util.List

Điều gì xảy ra nếu ai đó muốn sử dụng util.List?

bạn có thể sử dụng tên đủ điều kiện hoặc nhập tên đổi tên

! import java.util. {Danh sách => JList}

import java.util. {Danh sách => JList}

+0

Điều này không có ý nghĩa với tôi – Paul

1

Chỉ cần thấy điều này rất có thể nó sẽ hữu ích để chia sẻ giải pháp của tôi. Nếu bạn đã nhập java.util.Map và cần phải sử dụng scala.collection.immutable.Map sau đó sử dụng nó với tên đầy đủ nên thay vì

Map(1 -> "one") 

làm

scala.collection.immutable.Map(1 -> "one") 

Bằng cách này nó sẽ Bạn biết gì về ý nghĩa của bạn

0

Vì trong mỗi lớp scala gốc có một đối tượng đồng hành (tùy chọn) (cho phép gán từ đối tượng đồng hành như trong mã ví dụ của bạn) khi kết hợp một lớp java vào mã scala luôn nhớ khởi tạo lớp học của tôi nvoking constructor, tức là. sử dụng từ khóa "mới", do đó tạo ra một giá trị.

+0

Điều này không cung cấp câu trả lời cho câu hỏi. Khi bạn có đủ [danh tiếng] (https://stackoverflow.com/help/whats-reputation), bạn sẽ có thể [nhận xét về bất kỳ bài đăng nào] (https://stackoverflow.com/help/privileges/comment); thay vào đó, [cung cấp câu trả lời không yêu cầu làm rõ từ người hỏi] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-thay thế). - [Từ đánh giá] (/ đánh giá/chất lượng thấp-bài viết/18617485) –

Các vấn đề liên quan