2014-04-19 32 views
6

sau Ví dụ Scala định nghĩa một lớp bên trong một đối tượng gói:Sử dụng lớp Scala quy định tại đối tượng gói từ Java

package com.mycompany 

package object test { 
    class MyTest { 
    def foo(): Int = { 
     42 
    } 
    } 
} 

Ba lớp học sau đây được tạo ra:

com/mycompany/test/package.class 
com/mycompany/test/package$.class 
com/mycompany/test/package$MyTest.class 

Vấn đề nảy sinh khi cố gắng sử dụng lớp MyTest từ Java. Tôi nghĩ rằng kể từ khi package$MyTest chứa một $ trong tên, Java không thừa nhận sự tồn tại của nó. Tuy nhiên, bạn có thể truy cập lớp học package$.

Chạy javap trên package$MyTest.class lợi nhuận:

Compiled from "Test.scala" 
public class com.mycompany.test.package$MyTest { 
    public int foo(); 
    public com.mycompany.test.package$MyTest(); 
} 

tôi đã cố gắng truy cập vào các lớp học sử dụng Eclipse, Intellij và Netbeans, nhưng không thành công. Có thể sử dụng các lớp Scala được định nghĩa trong các đối tượng gói từ Java không?

Trả lời

5

Định nghĩa một lớp bên trong đối tượng góitest hiện chưa được thực hiện cách tương tự như định nghĩa nó bên trong góitest, mặc dù nó có lẽ nên (điều này đang được theo dõi như SI-4344).

Do đó, thực hành tốt là chỉ đặt định nghĩa đối tượng gói không thể ở cấp cao nhất, như vals, defs, v.v. (đây là toàn bộ điểm của đối tượng gói) và rời khỏi lớp/định nghĩa đối tượng vào một định nghĩa gói bình thường:

package com.mycompany 

package object test { 
    // vals, defs, vars, etc. 
    val foobar = 42 
} 

package test { 
    // classes, objects, traits, etc. 
    class MyTest { 
    def foo(): Int = { 
     42 
    } 
    } 
} 

này sẽ tạo ra một MyTest lớp bình thường, dễ dàng truy cập từ Java:

com/mycompany/test/MyTest.class 
com/mycompany/test/package.class 
com/mycompany/test/package$.class 
+1

Điều này rất hữu ích khi tôi đang viết lớp gói, nhưng không phải khi tôi đang sử dụng thư viện của bên thứ ba. –

3

package$MyTest sau ước JVM cho các lớp lồng nhau, vì vậy nó sẽ hiển thị dưới dạng package.MyTest ... ngoại trừ đây không phải là tên hợp pháp trong Java. Có nghĩa là nó không thể được truy cập.

+0

Vì vậy .. * sau đó * what .. Tôi có 'loại' trong đối tượng gói được sử dụng phổ biến trong các lớp trong gói. Sau đó .. cho tất cả các lớp (hoặc nhiều hơn) các đặc điểm, vv chúng ta cần phải thực hiện một 'Import SomeContainer._' trong đó' SomeContainer' là một sự thay thế thân thiện với java đối tượng package? – javadba

+0

Bạn không thể sử dụng 'loại' trong Java. –

+0

Tôi phát hiện ra rằng "điều trị" ít (không có 'loại' trong java ..) ngay sau khi nhìn thấy câu trả lời này. Dường như việc sử dụng khung công tác scala trong java về cơ bản là không khởi động() Tôi đang tạo một bộ điều hợp riêng biệt để cho phép một tập con của chức năng scala có thể truy cập được thông qua java. không thể được coi là mục đích chung trong các nhóm java/scala: chỉ java -> scala thực sự hoạt động vượt ra ngoài những điều đơn giản – javadba

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