2013-08-05 47 views
9

Tôi không thể hiểu tại sao điều này không hiệu quả. Các lớp cấp cao nhất của tôi nằm trong các gói chưa được đặt tên (hiện tại, tôi đang lên kế hoạch thiết lập các gói sau).Đang cố gắng nhập các loại lồng nhau từ lớp

Iclass1.java:

public class Iclass1 {  
    public static class Nested1 { 
     // whatever 
    }  
} 

Iclass2.java:

import Iclass1.*; 
public class Iclass2 { 
    private Nested1 someMember; 
    // etc. 
} 

Sau khi tôi biên dịch Iclass1.java không có lỗi, trình biên dịch phàn nàn khi tôi biên dịch Iclass2.java: "Lỗi: gói Iclass1 không tồn tại ".

Nhưng JLS nói: (7.5.2)

import PackageOrTypeName . * ; 

The PackageOrTypeName must be the canonical name (§6.7) of a package, a class type, an interface type, an enum type, or an annotation type.

và: (6,7)

The fully qualified name of a top level class or top level interface that is declared in an unnamed package is the simple name of the class or interface.

For every primitive type, named package, top level class, and top level interface, the canonical name is the same as the fully qualified name.

Vì vậy, nó có vẻ như Iclass1 là tên chuẩn của loại I' m cố gắng sử dụng trong import. Tôi đang làm gì sai?

(T.B. bây giờ tôi nghĩ import static sẽ tốt hơn, nhưng nó không hoạt động nữa.)

+0

nhưng - trên tất cả - đó là câu trả lời đúng? –

+0

Câu trả lời được chỉnh sửa ngay bây giờ của Sajal giải quyết đúng câu hỏi. Các câu trả lời khác là sai (các giải pháp được đề xuất không hoạt động) hoặc không hữu ích (họ chỉ nói "không làm điều đó") hoặc cả hai. –

Trả lời

9

Vì bạn không có bao bì, không sử dụng nhập khẩu.

Vì JLS §7.5 cho bạn biết không:

A type in an unnamed package (§7.4.2) has no canonical name, so the requirement for a canonical name in every kind of import declaration implies that (a) types in an unnamed package cannot be imported, and (b) static members of types in an unnamed package cannot be imported. As such, §7.5.1, §7.5.2, §7.5.3, and §7.5.4 all require a compile-time error on any attempt to import a type (or static member thereof) in an unnamed package.

+0

Hmmm ... Đoạn bạn trích dẫn từ JLS là in nghiêng, có vẻ như cho biết rằng đây không phải là một "quy tắc" mà là văn bản giải thích giải thích hậu quả của các quy tắc. Nhưng nó có vẻ mâu thuẫn với các quy tắc trong 6.7, có nghĩa là một loại trong một gói không tên * không * có một tên kinh điển, và không thêm bất kỳ quy tắc nào nói trường hợp này là một ngoại lệ. Một cái gì đó có vẻ là mất tích. Trong mọi trường hợp, cảm ơn vì đã chỉ cho tôi "quy tắc" này, vì tự nhiên nó không giống như một quy tắc nên tôi không thể tìm thấy nó. – ajb

+0

@ajb Tôi nghĩ thật khó để họ giải thích nó. :) 6.7 bắt đầu bằng "... Mỗi kiểu nguyên thủy, có tên là gói, cấp cao nhất và giao diện cấp cao nhất có tên đầy đủ:". Lưu ý "gói có tên". –

+0

Nhưng không phải lớp học của tôi ở đây là "các lớp cấp cao nhất"? – ajb

-3

Nếu bạn muốn làm một nhập khẩu, do đó bạn có thể khai báo các thành viên tư nhân tại Iclass2 như private Nested1 someMember;, mà không làm Iclass1.Nested1 bạn phải có Iclass1 trong một gói.

Một khi bạn có nó trong một gói, bạn có thể nhập các thành viên lồng nhau như vậy:

import mypackage.Iclass1.Nested1; 
import mypackage.Iclass1.*; 
import static mypackage.Iclass1.Nested1; 
import static mypackage.Iclass1.*; 

Bạn không thể nhập bất cứ điều gì từ không gian tên mặc định/gói.

+0

Cả hai đều không hoạt động. –

+1

Các downvotes là vì câu trả lời này là không chính xác. Bạn chỉ đơn giản là không thể nhập từ một gói chưa đặt tên. –

0

Rất không phù hợp với java, nhưng có vẻ như bạn không thể nhập các lớp bên trong nếu lớp chứa cấp cao nhất nằm trong gói mặc định.

Nếu bạn đặt hai lớp vào bất kỳ gói nào, quá trình nhập sẽ hoạt động tốt.

Hãy thử tạo thư mục cho hai lớp được gọi là foo, di chuyển chúng trong đó, sau đó thêm package foo; làm dòng đầu tiên trong mỗi tệp.

+1

Tôi không nghĩ anh ấy đang cố gắng giải quyết vấn đề, tôi nghĩ anh ấy đang cố hiểu nó. – keyser

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