2013-08-05 4 views
9

से नेस्टेड प्रकारों को आयात करने का प्रयास कर रहा हूं, मुझे पता नहीं लगा कि यह क्यों काम नहीं करता है। मेरे शीर्ष-स्तरीय वर्ग अज्ञात पैकेज में हैं (अभी के लिए; मैं बाद में पैकेज स्थापित करने की योजना बना रहा हूं)।वर्ग

Iclass1.java:

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

Iclass2.java:

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

बाद मैं कोई त्रुटि के साथ Iclass1.java संकलन, संकलक की शिकायत जब मैं Iclass2.java संकलन: "त्रुटि: पैकेज Iclass1 मौजूद नहीं है "।

लेकिन JLS कहते हैं: (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.

और: (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.

तो ऐसा लगता है Iclass1 तरह प्रकार मैं का प्रामाणिक नाम है मैं import में उपयोग करने की कोशिश कर रहा हूं। मैं क्या गलत कर रहा हूं?

(पी एस मैं अब लगता है import static बेहतर होता है, लेकिन यह या तो काम नहीं करता।)

+0

लेकिन - सभी पर - सही जवाब कौन सा है? –

+0

साजल का अब-संपादित उत्तर प्रश्न को सही तरीके से संबोधित करता है। अन्य उत्तरों या तो गलत हैं (सुझाए गए समाधान काम नहीं करते हैं) या अनुपयोगी (वे सिर्फ "ऐसा नहीं करते") या दोनों कहते हैं। –

उत्तर

9

चूंकि आपने कोई संकुल है, आयात का उपयोग नहीं करते।

क्योंकि JLS §7.5 आपको बताता है कि नहीं करने के लिए:

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

हम्म ... जेएलएस से उद्धृत मार्ग इटालिक्स में है, जो यह इंगित करता है कि यह "नियम" होने का इरादा नहीं है बल्कि व्याख्यात्मक पाठ है जो नियमों के परिणामों को बताता है। लेकिन ऐसा लगता है कि 6.7 में नियमों का खंडन होता है, जो दर्शाता है कि एक अनाम पैकेज में एक प्रकार * का एक कैनोलिक नाम है, और यह कोई नियम नहीं जोड़ता है जो कहता है कि यह मामला अपवाद है। कुछ याद आ रही है। किसी भी घटना में, मुझे इस "नियम" को इंगित करने के लिए धन्यवाद, क्योंकि स्वाभाविक रूप से यह एक नियम की तरह नहीं दिख रहा था, इसलिए मुझे यह नहीं मिला। – ajb

+0

@ajb मुझे लगता है कि उनके लिए यह भी समझाना मुश्किल था। :) 6.7 से शुरू होता है "... प्रत्येक आदिम प्रकार, नामित पैकेज, शीर्ष स्तर की कक्षा, और शीर्ष स्तर इंटरफ़ेस का पूर्णतः योग्य नाम है:"। नोट "नाम पैकेज"। –

+0

लेकिन मेरी कक्षाएं यहां "शीर्ष स्तर की कक्षाएं" नहीं हैं? – ajb

-3

आप, private Nested1 someMember; रूप Iclass2 में निजी सदस्य घोषणा कर सकते हैं Iclass1.Nested1 कर के बिना एक आयात करना चाहते हैं तो आप एक पैकेज में Iclass1 होना आवश्यक है।

एक बार जब आप यह एक पैकेज में है, तो आप तो जैसे नेस्टेड सदस्यों आयात कर सकते हैं:

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

आप डिफ़ॉल्ट नाम स्थान/पैकेज से कुछ भी आयात नहीं कर सकते।

+0

इनमें से कोई भी काम नहीं। –

+1

डाउनवॉट्स इसलिए हैं क्योंकि यह उत्तर सही नहीं है। आप बस एक अज्ञात पैकेज से आयात नहीं कर सकते हैं। –

0

यह जावा का बहुत असंगत है, लेकिन ऐसा लगता है कि यदि आप शीर्ष स्तर कंटेनर क्लास डिफ़ॉल्ट पैकेज में हैं तो आप आंतरिक कक्षाएं आयात नहीं कर सकते हैं।

यदि आप किसी भी पैकेज में दो कक्षाएं डालते हैं, तो काम ठीक से आयात करते हैं।

foo नामक उन दो वर्गों के लिए निर्देशिका बनाने का प्रयास करें, उन्हें वहां स्थानांतरित करें, फिर प्रत्येक फ़ाइल में पहली पंक्ति के रूप में package foo; जोड़ना।

+1

मुझे नहीं लगता कि वह समस्या को हल करने की कोशिश कर रहा है, मुझे लगता है कि वह इसे समझने की कोशिश कर रहा है। – keyser

संबंधित मुद्दे