เป็นใหม่เพื่อ Java ฉันสับสนระหว่างแนวคิดของระดับและประเภท ตัวอย่างเช่นวัตถุควร"Hello World!"
อยู่ในประเภท String
หรือคลาส String
หรือไม่? หรืออาจจะทั้งสองอย่าง?
เป็นใหม่เพื่อ Java ฉันสับสนระหว่างแนวคิดของระดับและประเภท ตัวอย่างเช่นวัตถุควร"Hello World!"
อยู่ในประเภท String
หรือคลาส String
หรือไม่? หรืออาจจะทั้งสองอย่าง?
คำตอบ:
คลาสคือประเภท อินเทอร์เฟซเป็นประเภทหนึ่ง ดึกดำบรรพ์เป็นประเภทหนึ่ง อาร์เรย์คือประเภท
ดังนั้นทุกประเภทยังเป็นคลาส (รวมถึงค่าคงที่ enum) อินเทอร์เฟซแบบดั้งเดิมหรืออาร์เรย์
มีสองประเภทที่แตกต่างกันประเภทดั้งเดิมและประเภทอ้างอิง:
Object
วัตถุทั้งหมดรวมทั้งอาร์เรย์สนับสนุนวิธีการของการเรียน ประเภทการอ้างอิงคือประเภทคลาส (รวมถึงประเภท enum) ประเภทอินเทอร์เฟซและประเภทอาร์เรย์ข้อมูลทุกชิ้นมีประเภทที่กำหนดโครงสร้าง ได้แก่ จำนวนหน่วยความจำที่ต้องใช้จัดวางอย่างไรและที่สำคัญกว่านั้นคือคุณจะโต้ตอบกับมันได้อย่างไร
ตัวอย่างของประเภทดั้งเดิม:
int
float
char
boolean
ตัวอย่างประเภทคลาส:
ตัวอย่างประเภทอินเทอร์เฟซ:
ตัวอย่างประเภทอาร์เรย์:
int[]
String[]
Integer[][][]
โดยพื้นฐานแล้วสิ่งที่คุณสามารถอ้างถึงเป็นตัวแปรจะมีประเภทและคลาสเป็นประเภทหนึ่ง
ข้อมูลเพิ่มเติมที่นี่: http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html
TLDR - Class เป็นหนึ่งใน Type ใน Java
หมายเหตุ - เพื่อให้เข้าใจคำตอบอย่างสมบูรณ์คุณต้องมีความคิดเล็กน้อยเกี่ยวกับ generics ใน Java
เพื่อให้เข้าใจถึงความแตกต่างให้เราเข้าใจก่อนว่าTypeคืออะไรใน Java
ตามJLS SE 10 ,
ภาษาโปรแกรม Java มีสองประเภทได้แก่ ประเภทดั้งเดิม ( §4.2 ) และประเภทอ้างอิง (§4.3)
ประเภทดั้งเดิมคืออะไร?
ก) ประเภทอินทิกรัลคือไบต์สั้น int และยาวซึ่งมีค่าคือ 8 บิต 16 บิต 32 บิตและ 64 บิตที่เซ็นชื่อสองจำนวนเต็มเสริมตามลำดับและถ่านซึ่งมีค่า 16 บิต จำนวนเต็มไม่ได้ลงนามแทนหน่วยรหัส UTF-16 (§3.1)
ข) ประเภทจุดลอยตัวมีลอยที่มีค่ารวม 32 บิตอีอีอี 754 จำนวนจุดลอยตัวและคู่ที่มีค่ารวม 64 บิตอีอีอี 754 จำนวนจุดลอยตัว
c) ประเภทบูลีนมีสองค่า: จริงและเท็จ
ตอนนี้ให้เรามาที่ประเภทอ้างอิงคืออะไร?
ประเภทอ้างอิงมีสี่ประเภท ได้แก่ ประเภทคลาส ( §8.1 ) ประเภทอินเทอร์เฟซ ( §9.1 ) ตัวแปรประเภท ( §4.4 ) และประเภทอาร์เรย์ ( §10.1 )
ให้เราคุยกันทีละคน
หากคุณเห็นว่าใน JLS คลาสถูกกำหนดไว้เช่นนี้:
การประกาศคลาสระบุชนิดการอ้างอิงที่ตั้งชื่อใหม่
มีสองชนิดของการประกาศระดับคือ: การประกาศระดับปกติและประกาศ enum
ClassDeclaration:
NormalClassDeclaration
EnumDeclaration
NormalClassDeclaration:
{ClassModifier} class TypeIdentifier [TypeParameters] [Superclass] [Superinterfaces] ClassBody
คุณจะเห็นว่า[TypeParameters]
สิ่งนี้แสดงให้เห็นว่าประเภทชั้นเรียนรวมถึงคลาสทั่วไปเหล่านั้นด้วย
class Example<T>{
}
ประเภทคลาสจะถูกเรียก Example
กล่าวโดยย่อคือประเภทคลาสจะครอบคลุม enums ของเราคลาสปกติ (ไม่ใช่คลาสทั่วไป) String
ของเราเช่นetc และคลาสทั่วไปของเราด้วย
ในทำนองเดียวกันฉันหวังว่าอินเทอร์เฟซและประเภทอาร์เรย์จะชัดเจนเช่นกัน ตามประเภทอาร์เรย์เราหมายถึงชอบint[]
, String[]
ฯลฯ
ให้เรามาที่ส่วนสุดท้าย - ประเภทตัวแปร พวกเขาคืออะไร?
ตัวแปร type คือตัวระบุที่ไม่มีเงื่อนไขที่ใช้เป็นประเภทในคลาสอินเตอร์เฟสเมธอดและคอนสตรัคเตอร์
ให้เราเข้าใจตามตัวอย่างใน JLS ด้านล่าง
class Test {
<T extends C & I> void test(T t) {
t.mI(); // OK
t.mCPublic(); // OK
t.mCProtected(); // OK
t.mCPackage(); // OK
}
}
T
คุณจะเห็นว่าวัตถุของคุณในพารามิเตอร์วิธีการที่เป็นประเภท ใช่นี่T
คือตัวแปร Type และสามารถใช้เป็นข้อมูลอ้างอิงได้ ใช่แล้ว. (ไม่เข้าใจตัวอย่างแปลก ๆ นี้ - เรียนรู้วิธีการทั่วไปใน Java คืออะไร)
คำตอบนี้เสร็จสมบูรณ์
"ประเภท" คือหมวดหมู่ที่รวมมากกว่า ตัวแปรใน Java สามารถมีได้ 3 ประเภท ได้แก่ ประเภท "ดั้งเดิม" 8 ประเภทเช่น int และ float อินเทอร์เฟซและคลาส ค่า (ตรงข้ามกับตัวแปร) อาจเป็นอินสแตนซ์ดั้งเดิมหรือคลาส
"ประเภท" กำหนด "ประเภทของข้อมูล"
เช่น "hello world" เป็น String -> "hello world" เป็นประเภท String (String ไม่ใช่ข้อมูล premetive ซึ่งแตกต่างจาก int .. ดังนั้นเราจึงสามารถพูดว่า "hello world" เป็นประเภทคลาสสตริง)
10 คือ int -> 10 เป็นชนิดข้อมูลจำนวนเต็ม
นี่เป็นคำถามเกี่ยวกับคำศัพท์เกี่ยวกับการเขียนโปรแกรมและตามที่คาดไว้ยังมีอีกคำตอบหนึ่งที่ถือว่าถูกต้อง
ระบบประเภท Java ตามที่เปิดเผยโดย API การสะท้อนมีสองประเภท: Class<T>
คลาสและType
อินเทอร์เฟซซึ่งใช้ในอดีต ในระบบนี้ชั้น (องค์ประกอบที่อธิบายไว้โดยตัวอย่างของClass<T>
) เป็นชนิดใด ๆ ที่สร้างขึ้นด้วยคำหลักclass
หรือinterface
ชนิดดั้งเดิมใด ๆ อาร์เรย์ใด ๆ void
ดังกล่าวและ อย่างอื่นเป็นเพียงType
.
แล้วอย่างอื่นคืออะไร? แม้ว่าคลาสในบริบทนี้จะเป็นทุกสิ่งที่รันไทม์มองเห็นและเข้าถึงได้เมื่อพิจารณาถึงความสามารถของอ็อบเจ็กต์ แต่โดยทั่วไปแล้วประเภทคือทุกสิ่งที่คอมไพเลอร์เห็น นี้อาจจะเป็นประเภท parametrized (ชอบArrayList<String>
- จำไว้ว่าลบออกประเภททำให้เกิดทุกArrayList<T>
การแมปไปชั้นเดียวกันที่รันไทม์) ซึ่งเป็นพารามิเตอร์ประเภททั่วไปที่สร้างขึ้นเป็นส่วนหนึ่งของวิธีการหรือชั้นเรียนการประกาศเป็นประเภทสัญลักษณ์แทนและใด ๆอาร์เรย์นั้น ประเภทเหล่านี้ถูกเปิดเผยโดยวิธี API ในทุกที่ที่การลบประเภทไม่มีผลเช่นเมื่อข้ามผ่านประเภทพารามิเตอร์หรือประเภทฐาน