อินสแตนซ์ปิดล้อมที่มี <my reference> เป็นสิ่งจำเป็น


93

จำเป็นต้องมีอินสแตนซ์ปิดล้อมที่มี

ด้านล่างนี้คือรหัส positionObjเป็นวัตถุที่ฉันพยายามใช้และมันทำให้ฉันมีข้อผิดพลาดข้างต้น

มันไม่ชัดเจนว่าทำไม

package toolBox;
import toolBox.Secretary.positionObj;    

public class PositionManagement {
    public static HashMap<String, Secretary.positionObj> main(String vArg){
        positionObj newPosition=new positionObj();
    }
}

คำตอบ:


131

คุณกำลังพยายามใช้positionObjคลาสภายในที่ไม่คงที่โดยไม่มีอินสแตนซ์Secretaryให้เป็นของ
คลาสภายในที่ไม่คงที่ต้องเป็นของอินสแตนซ์ของคลาสแม่

คุณควรเปลี่ยนpositionObjเป็นคลาสปกติหรือคลาสภายในแบบคงที่

หรือคุณสามารถเขียนsomeSecretary.new positionObj()เพื่อสร้างอินสแตนซ์ของคลาสภายในที่เป็นของsomeSecretaryอินสแตนซ์


เห็นด้วย แต่คำแถลงทั่วไปนี้ยังไม่ชัดเจน คุณช่วยยกตัวอย่างหรือชี้สถานที่ที่อาจอธิบายเรื่องนี้ได้ดีกว่านี้ได้ไหม ขอบคุณ
jason m

ใช่. ฉันตระหนักเมื่อพยายามดีบักว่าถ้าฉันทำให้ positionObj ของฉันเป็นแบบคงที่แสดงว่ามันใช้งานได้ (ในระดับเลขานุการ) ฉันมีความสุขและตอนนี้ทุกอย่างใช้งานได้ แต่ขอบคุณสำหรับตัวชี้ จะตรวจสอบสาเหตุที่แท้จริงของข้อผิดพลาดนี้
jason m

2
สาเหตุที่แท้จริงของข้อผิดพลาดคือคุณไม่ได้ให้อินสแตนซ์หลัก อย่าใช้การเรียนภายในไม่คงที่จนกว่าคุณต้องการจริงๆหนึ่งและคุณเข้าใจวิธีการทำงาน c2.com/ppr/wiki/JavaIdioms/NoPublicInnerClasses.html
SLaks

โซลูชันทั้งสองทำงานได้อย่างสมบูรณ์ [1- ทำให้คลาส positionObj คงที่และ 2- ใช้ OuterClass.new classObj ()] ขอบคุณ
jason m

ใช่. อย่างไรก็ตามคุณต้องเข้าใจฐานรหัสของคุณให้ดีพอที่จะเข้าใจว่าอันไหนถูกต้อง
SLaks

17

ขั้นแรกให้สร้างวัตถุของคลาสชั้นนอก ในกรณีนี้ผมคิดว่า "เลขา" จากนั้นสร้าง positionObj แบบนี้,

Secretary x = new Secretary();
Secretary.positionObj y = x.new positionObj();

ขอบคุณ! ... ฉันใช้ Java ตั้งแต่ v 1.0 และฉันไม่รู้ว่าคุณทำได้!
Richard T

0

ลายเซ็นทั่วไปที่ถูกต้องจะเป็น

public static HashMap<String, positionObj> main(String vArg)

คุณไม่จำเป็นต้องมีคุณสมบัติใน positionObj เนื่องจากคุณได้นำเข้าแล้ว

อย่างไรก็ตามฉันค่อนข้างแน่ใจว่าวิธีการหลักต้องเป็นไปตามลายเซ็นด้านล่าง หากคุณต้องการให้ main เป็นวิธีการหลักสำหรับโปรแกรมของคุณให้เปลี่ยนลายเซ็นเป็น

 public static void main(String[] args) {...}

คุณสามารถสร้างวิธีการแบบคงที่แยกต่างหากที่ส่งคืนแผนที่และเรียกใช้จาก main

โปรดทราบว่าทุกชั้นเรียนควรขึ้นต้นด้วยอักษรตัวใหญ่ positionObj ควรเป็น PositionObj


เฮ้ทิ้งรหัสไว้ ตกลงเกี่ยวกับคดี ชั้นเรียนส่งคืนบางสิ่ง แต่ข้อผิดพลาดอยู่ที่นี่และฉันไม่ชัดเจนว่าทำไม
jason m

@jason ฉันไม่คิดว่าคุณจะคืนอะไรจาก main ได้
hvgotcodes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.