2010-01-27 27 views
8

Tôi đang làm việc trên dự án Scala đang nhập hai thư viện java. Thông qua kế hoạch kém, hai thư viện java có tên gói tương tự, một với com ở phía trước, một không có.Nhập gói java Scala java thêm

Vấn đề là Scala đang tìm gói với com ở phía trước đầu tiên, và nói với tôi rằng gói không tồn tại. Nếu tôi loại bỏ tất cả các tham chiếu đến thư viện với com ở phía trước của gói, biên dịch hoạt động.

Để hiển thị một ví dụ có ý nghĩa:

Trong foo.jar chúng ta có một gói company.product.core

Trong bar.jar chúng tôi có một com.company.product.other gói.

Nếu cả hai lọ là trên classpath, dòng:

import company.product.core.ClassName 

Thất bại với lỗi "giá trị cốt lõi không phải là thành viên của gói com.companyname.product" Nếu chúng ta loại bỏ bar.jar, các biên dịch hoạt động tốt.

Scala có đang cố gắng cứu tôi khỏi việc nhập com không? Có cách nào để nói với nó để nhập khẩu chỉ những gì tôi nói với nó?

Trả lời

11

Sử dụng tiền tố _root_ trong báo cáo nhập. Nó làm cho độ phân giải gói tuyệt đối.

import _root_.company.product.core.ClassName 
import _root_.com.company.product.other.ClassName 

Đề cập đến bạn nhận xét: với nhập tương đối, bạn có thể làm điều gì đó như thế này. Nó về cơ bản giúp bạn tiết kiệm một số đánh máy.

import _root_.company.product.core 
import ClassAFromCore 
import ClassBFromCore 
+0

Điều này có hiệu quả, nhưng tôi tò mò là tại sao Scala thực hiện việc này? – Jeff

+0

Scala cho phép đối sánh tương đối từ lần nhập gói trước. Giống như, sau khi "nhập scala.collection._" bạn chỉ có thể gọi "import mutable._" để nhận "scala.collection.mutable._". Nó gây ra rất nhiều điều thú vị với tên gói "net". –

+0

@Tristan import collection._ cũng hoạt động (scala đã được nhập) –

4

tôi sẽ đoán rằng nơi bạn đặt dòng nhập khẩu thuộc về một gói bắt đầu bằng "com.", như thế này:

package com.whatever 
import company.product.core.ClassName 

Điều đó có nghĩa tất cả các com., bao gồm com.company, là một phần của phạm vi, và do đó, com.company là, do đó, che bóng các company đó là gốc, như các đối tượng gần gũi hơn trong phạm vi phân cấp bóng xa hơn.

Đối với bất kỳ giá trị nào, Scala 2.8 sẽ có các quy tắc hơi khác nhau. Bây giờ, nếu tôi xác định gói của tôi là:

package com.c.b.a 

sau đó chỉa sẽ nằm trong phạm vi. Nếu tôi muốn nhận được hành vi trước đó, tôi cần phải làm:

package com 
package c 
package b 
package a