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

Generics เป็นรูปแบบหนึ่งของตัวแปรหลายตัวแปรที่พบในภาษาต่าง ๆ รวมถึงภาษา. NET, Java, Swift และ Rust



8
Java generics T vs Object
ฉันสงสัยว่าอะไรคือความแตกต่างระหว่างการประกาศสองวิธีต่อไปนี้: public Object doSomething(Object obj) {....} public <T> T doSomething(T t) {....} มีบางอย่างที่คุณสามารถ / จะทำกับสิ่งอื่นได้หรือไม่? ฉันไม่พบคำถามนี้จากที่อื่นในไซต์นี้
127 java  generics 

4
เครื่องหมายทิลเดอร์ในวงเล็บเหลี่ยมหมายถึงอะไรเมื่อสร้างคลาสทั่วไปของ Java
ฉันกำลังอ่านตัวอย่าง JMockit และพบรหัสนี้: final List<OrderItem> actualItems = new ArrayList<~>(); เครื่องหมายทิลเดอร์ในตัวระบุทั่วไปหมายถึงอะไร ฉันรู้ว่ามันเป็นโอเปอเรเตอร์ NOT แบบ unary bit แต่ไม่เห็นตัวถูกดำเนินการที่นี่ นอกจากนี้ฉันพยายามรวบรวมและพบข้อผิดพลาด ฉันขาดอะไรไปหรือเปล่า?

3
โปรโตคอลไม่สอดคล้องกับตัวเอง?
เหตุใดจึงไม่รวบรวมรหัส Swift นี้ protocol P { } struct S: P { } let arr:[P] = [ S() ] extension Array where Element : P { func test<T>() -> [T] { return [] } } let result : [S] = arr.test() คอมไพเลอร์ระบุว่า: "Type Pไม่เป็นไปตามโปรโตคอลP" (หรือใน Swift เวอร์ชันที่ใหม่กว่า "ไม่รองรับ" การใช้ "P" เป็นคอนกรีตที่สอดคล้องกับโปรโตคอล …

6
ทำไมไม่มียาชื่อสามัญใน Go?
ข้อจำกัดความรับผิดชอบ: ตอนนี้ฉันเล่นกับ Go เพียงวันเดียวดังนั้นมีโอกาสที่ดีที่ฉันพลาดไปมาก มีใครรู้บ้างไหมว่าทำไมไม่มีการรองรับ generics / template / whatsInAName ใน Go? ดังนั้นจึงมีแบบทั่วไปmapแต่จัดทำโดยคอมไพเลอร์ในขณะที่โปรแกรมเมอร์ Go ไม่สามารถเขียนการใช้งานของตัวเองได้ จากการพูดคุยเกี่ยวกับการทำให้ Go เป็นแบบตั้งฉากกันมากที่สุดทำไมฉันถึงใช้ประเภททั่วไป แต่ไม่สามารถสร้างใหม่ได้ โดยเฉพาะอย่างยิ่งเมื่อพูดถึงการเขียนโปรแกรมเชิงฟังก์ชั่นมี lambdas แม้กระทั่งการปิด แต่ด้วยระบบประเภทคงที่ซึ่งขาด generics ฉันจะเขียนฟังก์ชันลำดับที่สูงกว่าทั่วไปได้filter(predicate, list)อย่างไร? ตกลงรายการที่เชื่อมโยงและสิ่งที่คล้ายกันสามารถทำได้ด้วยการinterface{}เสียสละความปลอดภัยประเภท เนื่องจากการค้นหาอย่างรวดเร็วบน SO / Google ไม่ได้เปิดเผยข้อมูลเชิงลึกใด ๆ ดูเหมือนว่าข้อมูลทั่วไปจะถูกเพิ่มลงใน Go ในภายหลัง ฉันเชื่อว่า ธ อมป์สันจะทำได้ดีกว่าพวก Java แต่ทำไมต้องใช้ชื่อสามัญ? หรือมีการวางแผนและยังไม่ได้ดำเนินการ?

5
หลักการตั้งชื่อพารามิเตอร์ประเภททั่วไปสำหรับ Java (มีหลายตัวอักษร)?
ในบางอินเทอร์เฟซฉันเขียนว่าฉันต้องการตั้งชื่อพารามิเตอร์ประเภททั่วไปที่มีอักขระมากกว่าหนึ่งตัวเพื่อให้โค้ดอ่านง่ายขึ้น สิ่งที่ต้องการ.... Map<Key,Value> แทนสิ่งนี้ ... Map<K,V> แต่เมื่อพูดถึงวิธีการ type-parameters จะดูเหมือน java-class ซึ่งทำให้สับสนเช่นกัน public void put(Key key, Value value) ดูเหมือนว่าคีย์และค่าจะเป็นคลาส ฉันพบหรือนึกถึงสัญกรณ์บางอย่าง แต่ไม่มีอะไรเหมือนกับการประชุมจาก Sun หรือแนวปฏิบัติที่ดีที่สุดทั่วไป ทางเลือกอื่นที่ฉันเดาหรือพบ ... Map<KEY,VALUE> Map<TKey,TValue>

6
ฉันจะใช้ IEnumerable <T> ได้อย่างไร
ฉันรู้วิธีใช้ IEnumerable ที่ไม่ใช่แบบทั่วไปเช่นนี้: using System; using System.Collections; namespace ConsoleApplication33 { class Program { static void Main(string[] args) { MyObjects myObjects = new MyObjects(); myObjects[0] = new MyObject() { Foo = "Hello", Bar = 1 }; myObjects[1] = new MyObject() { Foo = "World", Bar = 2 }; foreach (MyObject x …
124 c#  .net  generics 

2
อะไรคือ“ โปรโตคอล…สามารถใช้เป็นข้อ จำกัด ทั่วไปได้เพราะมีข้อกำหนดในตัวเองหรือประเภทที่เกี่ยวข้อง” หมายความว่าอย่างไร
ฉันกำลังพยายามสร้างพจนานุกรม (จริงๆแล้วเป็นHashSet ) ที่คีย์บนโปรโตคอลที่กำหนดเองใน Swift แต่มันทำให้ฉันมีข้อผิดพลาดในชื่อ: โปรโตคอล 'myProtocol' สามารถใช้เป็นข้อ จำกัด ทั่วไปเท่านั้นเนื่องจากมีข้อกำหนดในตัวเองหรือประเภทที่เกี่ยวข้อง และฉันไม่สามารถสร้างหัวหรือหางของมันได้ protocol Observing: Hashable { } var observers = HashSet&lt;Observing&gt;()

8
เมื่อใดควรใช้วิธีการทั่วไปและเมื่อใดควรใช้ไวด์การ์ด
ฉันกำลังอ่านเกี่ยวกับวิธีการทั่วไปจากOracleDocGenericMethod ฉันค่อนข้างสับสนเกี่ยวกับการเปรียบเทียบเมื่อมีการบอกว่าเมื่อใดควรใช้ไวด์การ์ดและเมื่อใดควรใช้วิธีการทั่วไป อ้างจากเอกสาร interface Collection&lt;E&gt; { public boolean containsAll(Collection&lt;?&gt; c); public boolean addAll(Collection&lt;? extends E&gt; c); } เราสามารถใช้วิธีการทั่วไปได้ที่นี่แทน: interface Collection&lt;E&gt; { public &lt;T&gt; boolean containsAll(Collection&lt;T&gt; c); public &lt;T extends E&gt; boolean addAll(Collection&lt;T&gt; c); // Hey, type variables can have bounds too! } […] สิ่งนี้บอกเราว่าประเภทอาร์กิวเมนต์ถูกใช้สำหรับความหลากหลาย; ผลกระทบเพียงอย่างเดียวคืออนุญาตให้ใช้ประเภทอาร์กิวเมนต์จริงที่หลากหลายในไซต์การร้องขอที่แตกต่างกัน หากเป็นเช่นนั้นควรใช้สัญลักษณ์แทน สัญลักษณ์แทนได้รับการออกแบบมาเพื่อรองรับการพิมพ์ย่อยที่ยืดหยุ่นซึ่งเป็นสิ่งที่เราพยายามแสดงที่นี่ เราไม่คิดว่าไวด์การ์ด(Collection&lt;? extends E&gt; …
122 java  generics  wildcard 

5
การใช้ฟิลด์ของวัตถุเป็นคีย์พจนานุกรมทั่วไป
ถ้าฉันต้องการใช้ออบเจ็กต์เป็นคีย์สำหรับ a Dictionaryฉันจะต้องใช้วิธีการใดในการลบล้างเพื่อเปรียบเทียบในลักษณะเฉพาะ สมมติว่าฉันมีคลาสที่มีคุณสมบัติ: class Foo { public string Name { get; set; } public int FooID { get; set; } // elided } และฉันต้องการสร้าง: Dictionary&lt;Foo, List&lt;Stuff&gt;&gt; ฉันต้องการให้Fooวัตถุที่มีสิ่งเดียวกันFooIDถือเป็นกลุ่มเดียวกัน วิธีใดที่ฉันจะต้องแทนที่ในFooชั้นเรียน สรุป: ฉันต้องการจัดประเภทStuffวัตถุเป็นรายการโดยจัดกลุ่มตามFooวัตถุ Stuffออบเจ็กต์จะมีFooIDลิงค์เข้ากับหมวดหมู่

6
การส่งคืน 'IList' เทียบกับ 'ICollection' เทียบกับ 'Collection'
ฉันสับสนเกี่ยวกับประเภทคอลเลกชันที่ฉันควรส่งคืนจากเมธอดและคุณสมบัติ API สาธารณะของฉัน คอลเลกชันที่ฉันมีในใจIList, และICollectionCollection การส่งคืนประเภทใดประเภทหนึ่งเหล่านี้เป็นที่ต้องการมากกว่าประเภทอื่น ๆ เสมอหรือขึ้นอยู่กับสถานการณ์เฉพาะหรือไม่
120 c#  .net  generics  collections 

11
เหตุใดฉันจึงใช้ค่าลอยเป็นพารามิเตอร์เทมเพลตไม่ได้
เมื่อฉันพยายามใช้floatเป็นพารามิเตอร์เทมเพลตคอมไพลเลอร์จะร้องหารหัสนี้ในขณะที่intทำงานได้ดี เป็นเพราะฉันไม่สามารถใช้floatเป็นพารามิเตอร์เทมเพลตได้หรือไม่? #include&lt;iostream&gt; using namespace std; template &lt;class T, T defaultValue&gt; class GenericClass { private: T value; public: GenericClass() { value = defaultValue; } T returnVal() { return value; } }; int main() { GenericClass &lt;int, 10&gt; gcInteger; GenericClass &lt; float, 4.6f&gt; gcFlaot; cout &lt;&lt; "\n sum of integer is …

4
สืบทอดมาจากคลาสพื้นฐานทั่วไปใช้ข้อ จำกัด และใช้อินเทอร์เฟซใน C #
นี่คือคำถามเกี่ยวกับไวยากรณ์ ฉันมีคลาสทั่วไปที่สืบทอดมาจากคลาสพื้นฐานทั่วไปและกำลังใช้ข้อ จำกัด กับพารามิเตอร์ชนิดหนึ่ง ฉันยังต้องการให้คลาสที่ได้รับมาใช้อินเทอร์เฟซ สำหรับชีวิตของฉันดูเหมือนว่าฉันไม่สามารถเข้าใจไวยากรณ์ที่ถูกต้องได้ นี่คือสิ่งที่ฉันมี: DerivedFoo&lt;T1,T2&gt; : ParentFoo&lt;T1, T2&gt; where T2 : IBar { ... } สิ่งแรกที่นึกถึงคือ: DerivedFoo&lt;T1,T2&gt; : ParentFoo&lt;T1, T2&gt; where T2 : IBar, IFoo { ... } แต่นั่นไม่ถูกต้องเนื่องจากทำให้ T2 จำเป็นต้องใช้ทั้ง IBar และ IFoo ไม่ใช่ DerivedFoo เพื่อใช้ IFoo ฉันได้ลองใช้ Googling ใช้เครื่องหมายทวิภาคอัฒภาค ฯลฯ แล้ว แต่กลับสั้นลง ฉันแน่ใจว่าคำตอบนั้นง่ายมาก

6
ฉันจะส่งคืนอะไรหากประเภทการส่งคืนของเมธอดเป็นโมฆะ (ไม่เป็นโมฆะ!)
เนื่องจากการใช้ Generics ใน Java ฉันจึงต้องใช้ฟังก์ชันที่มีVoidประเภท return: public Void doSomething() { //... } และคอมไพเลอร์เรียกร้องให้ผมกลับมาบางสิ่งบางอย่าง ตอนนี้ฉันเพิ่งกลับมาnullแต่ฉันสงสัยว่านั่นเป็นการฝึกเขียนโค้ดที่ดีหรือไม่ ... ฉันกำลังถามเกี่ยวกับV ‌oid ไม่ใช่v ‌oid ชั้นVoid, ไม่voidคำหลักที่สงวนไว้ ฉันได้ลองVoid.classแล้วvoidเช่นVoid.TYPEกันnew Void()ไม่กลับมาเลย แต่ทั้งหมดนั้นไม่ได้ผลเลย (ด้วยเหตุผลที่ชัดเจนมากหรือน้อย) (ดูรายละเอียดคำตอบนี้ ) แล้วฉันควรจะส่งคืนอะไรถ้าประเภทการส่งคืนของฟังก์ชันคือVoidอะไร? การใช้งานทั่วไปของVoidคลาสคืออะไร?
115 java  generics  void 

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