คำถามติดแท็ก instanceof

อินสแตนซ์ของเป็นตัวดำเนินการที่มีอยู่ในภาษาเชิงวัตถุบางภาษารวมถึง Java, php และ JavaScript โดยทั่วไปจะช่วยให้โปรแกรมเมอร์ตรวจสอบว่าวัตถุที่ส่งผ่านไปเป็นตัวถูกดำเนินการด้านซ้ายเป็นอินสแตนซ์ของคลาสที่ระบุโดยตัวถูกดำเนินการด้านขวาหรือไม่

8
การหลีกเลี่ยงอินสแตนซ์ของ Java
การมีห่วงโซ่ของการดำเนินการ "instanceof" ถือเป็น "กลิ่นรหัส" คำตอบมาตรฐานคือ "ใช้ความหลากหลาย" ฉันจะทำอย่างไรในกรณีนี้? มีคลาสย่อยจำนวนหนึ่งของคลาสพื้นฐาน ไม่มีใครอยู่ภายใต้การควบคุมของฉัน สถานการณ์ที่คล้ายคลึงกันจะเป็นกับคลาส Java Integer, Double, BigDecimal เป็นต้น if (obj instanceof Integer) {NumberStuff.handle((Integer)obj);} else if (obj instanceof BigDecimal) {BigDecimalStuff.handle((BigDecimal)obj);} else if (obj instanceof Double) {DoubleStuff.handle((Double)obj);} ฉันสามารถควบคุม NumberStuff และอื่น ๆ ได้ ฉันไม่ต้องการใช้โค้ดหลายบรรทัดโดยที่ไม่กี่บรรทัดจะทำได้ (บางครั้งฉันทำแผนที่ HashMap Integer.class กับอินสแตนซ์ของ IntegerStuff, BigDecimal.class ไปยังอินสแตนซ์ของ BigDecimalStuff เป็นต้น แต่วันนี้ฉันต้องการสิ่งที่ง่ายกว่านี้) ฉันต้องการอะไรง่ายๆดังนี้: public …

6
จะดูว่าวัตถุเป็นอาร์เรย์โดยไม่ใช้การสะท้อนได้อย่างไร?
ฉันจะดูใน Java ได้อย่างไรว่า Object เป็นอาร์เรย์โดยไม่ใช้การสะท้อน และฉันจะทำซ้ำรายการทั้งหมดโดยไม่ใช้การสะท้อนกลับได้อย่างไร ฉันใช้ Google GWT ดังนั้นฉันจึงไม่ได้รับอนุญาตให้ใช้การสะท้อนกลับ :( ฉันชอบที่จะใช้วิธีการต่อไปนี้โดยไม่ต้องใช้การสะท้อนกลับ: private boolean isArray(final Object obj) { //??.. } private String toString(final Object arrayObject) { //??.. } BTW: ฉันไม่ต้องการใช้ JavaScript เพื่อให้สามารถใช้ในสภาพแวดล้อมที่ไม่ใช่ GWT ได้
99 java  arrays  gwt  instanceof 

3
เหตุใด 'instanceof' ใน TypeScript จึงให้ข้อผิดพลาด "'Foo' หมายถึงประเภทเท่านั้น แต่ถูกใช้เป็นค่าที่นี่"?
ฉันเขียนโค้ดนี้ interface Foo { abcdef: number; } let x: Foo | string; if (x instanceof Foo) { // ... } แต่ TypeScript ทำให้ฉันมีข้อผิดพลาดนี้: 'Foo' only refers to a type, but is being used as a value here. เหตุใดจึงเกิดขึ้น ฉันคิดว่าinstanceofสามารถตรวจสอบได้ว่าค่าของฉันมีประเภทที่กำหนดหรือไม่ แต่ดูเหมือนว่า TypeScript จะไม่ชอบสิ่งนี้


2
ตัวดำเนินการ 'instanceof' ทำงานแตกต่างกันไปสำหรับอินเทอร์เฟซและคลาส
ฉันต้องการทราบเกี่ยวกับพฤติกรรมต่อไปนี้ของinstanceofตัวดำเนินการใน Java interface C {} class B {} public class A { public static void main(String args[]) { B obj = new B(); System.out.println(obj instanceof A); //Gives compiler error System.out.println(obj instanceof C); //Gives false as output } } ทำไมจึงเป็นเช่นนั้น? ไม่มีความสัมพันธ์ระหว่างinterface Cและclass Bแต่ให้เท็จในขณะที่obj instanceof Aให้คอมไพเลอร์ผิดพลาด?

8
มีอย่างเช่น instanceOf (Class <?> c) ​​ใน Java หรือไม่
ฉันต้องการตรวจสอบว่าวัตถุoเป็นอินสแตนซ์ของคลาสCหรือคลาสย่อยของC. ตัวอย่างเช่นถ้าpเป็นของชั้นPointที่ฉันต้องการx.instanceOf(Point.class)ที่จะเป็นtrueและจะเป็นx.instanceOf(Object.class)true ฉันต้องการให้มันใช้งานได้กับประเภทดั้งเดิมแบบบรรจุกล่อง ตัวอย่างเช่นถ้าxเป็นIntegerแล้วควรจะเป็นx.instanceOf(Integer.class)true มีอย่างนั้นหรือ? ถ้าไม่ฉันจะใช้วิธีการดังกล่าวได้อย่างไร?

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