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

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

20
วิธีการเรียงลำดับรายการ <T> ตามคุณสมบัติในวัตถุ
ฉันได้เรียนที่เรียกว่าOrderซึ่งมีคุณสมบัติเช่นOrderId, OrderDate, และQuantity Totalฉันมีรายชื่อของOrderชั้นนี้: List&lt;Order&gt; objListOrder = new List&lt;Order&gt;(); GetOrderList(objListOrder); // fill list of orders ตอนนี้ฉันต้องการเรียงลำดับรายการตามคุณสมบัติหนึ่งของOrderวัตถุเช่นฉันต้องการเรียงลำดับตามวันที่สั่งซื้อหรือรหัสสั่งซื้อ ฉันจะทำสิ่งนี้ใน C # ได้อย่างไร
1248 c#  generics  list  sorting 

21
สร้างวิธีการทั่วไป จำกัด T เพื่อ Enum
ฉันกำลังสร้างฟังก์ชั่นเพื่อขยายEnum.Parseแนวคิดที่ว่า อนุญาตให้แยกวิเคราะห์ค่าเริ่มต้นในกรณีที่ไม่พบค่า Enum เป็นกรณีตาย ดังนั้นฉันจึงเขียนสิ่งต่อไปนี้: public static T GetEnumFromString&lt;T&gt;(string value, T defaultValue) where T : Enum { if (string.IsNullOrEmpty(value)) return defaultValue; foreach (T item in Enum.GetValues(typeof(T))) { if (item.ToString().ToLower().Equals(value.Trim().ToLower())) return item; } return defaultValue; } ฉันได้รับข้อผิดพลาดไม่สามารถเป็นคลาสพิเศษSystem.Enumได้ ยุติธรรมเพียงพอ แต่มีวิธีแก้ปัญหาเพื่อให้ Generic Enum หรือฉันจะต้องเลียนแบบParseฟังก์ชั่นและส่งประเภทเป็นแอตทริบิวต์ซึ่งบังคับให้ความต้องการมวยที่น่าเกลียดในรหัสของคุณ แก้ไขข้อเสนอแนะด้านล่างทั้งหมดได้รับการชื่นชมอย่างมากขอบคุณ ตั้งรกรากอยู่ที่ (ฉันออกจากลูปเพื่อรักษาความรู้สึกตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ - ฉันใช้นี่เมื่อแยกวิเคราะห์ XML) public static class …

30
วิธีการสร้างอาร์เรย์ทั่วไปใน Java?
เนื่องจากการใช้งานจาวา generics คุณไม่สามารถมีรหัสเช่นนี้: public class GenSet&lt;E&gt; { private E a[]; public GenSet() { a = new E[INITIAL_ARRAY_LENGTH]; // error: generic array creation } } ฉันจะใช้สิ่งนี้ในขณะที่รักษาความปลอดภัยประเภทได้อย่างไร ฉันเห็นวิธีแก้ไขปัญหาในฟอรัม Java ที่เป็นเช่นนี้: import java.lang.reflect.Array; class Stack&lt;T&gt; { public Stack(Class&lt;T&gt; clazz, int capacity) { array = (T[])Array.newInstance(clazz, capacity); } private final T[] array; } แต่ฉันไม่เข้าใจว่าเกิดอะไรขึ้น

8
ฉันจะใช้การสะท้อนเพื่อเรียกใช้วิธีการทั่วไปได้อย่างไร
อะไรคือวิธีที่ดีที่สุดในการเรียกใช้เมธอดทั่วไปเมื่อไม่รู้จักพารามิเตอร์ชนิดในเวลารวบรวม แต่จะได้รับแบบไดนามิก ณ รันไทม์ ลองพิจารณาโค้ดตัวอย่างต่อไปนี้ - ภายในExample()เมธอดวิธีที่กระชับที่สุดในการเรียกGenericMethod&lt;T&gt;()ใช้โดยTypeเก็บในmyTypeตัวแปรคืออะไร? public class Sample { public void Example(string typeName) { Type myType = FindType(typeName); // What goes here to call GenericMethod&lt;T&gt;()? GenericMethod&lt;myType&gt;(); // This doesn't work // What changes to call StaticMethod&lt;T&gt;()? Sample.StaticMethod&lt;myType&gt;(); // This also doesn't work } public void GenericMethod&lt;T&gt;() { // …
1070 c#  .net  generics  reflection 

17
List <Dog> เป็นคลาสย่อยของ List <Animal> หรือไม่ ทำไม Java generics ถึงไม่ polymorphic โดยปริยาย?
ฉันสับสนเล็กน้อยเกี่ยวกับวิธีที่ Java generics จัดการกับการสืบทอด / polymorphism สมมติว่าลำดับชั้นดังต่อไปนี้ - สัตว์ (ผู้ปกครอง) สุนัข - แมว (เด็ก) doSomething(List&lt;Animal&gt; animals)ดังนั้นคิดว่าฉันมีวิธี ตามกฎของมรดกและ polymorphism ทั้งหมดผมจะคิดว่าList&lt;Dog&gt; เป็นList&lt;Animal&gt;และList&lt;Cat&gt; เป็นList&lt;Animal&gt; - และเพื่อคนใดคนหนึ่งอาจจะส่งผ่านไปยังวิธีการนี้ ไม่เช่นนั้น ถ้าผมต้องการที่จะบรรลุพฤติกรรมนี้ผมต้องบอกอย่างชัดเจนวิธีการที่จะยอมรับรายการ subclass ของสัตว์ใด ๆ doSomething(List&lt;? extends Animal&gt; animals)โดยกล่าวว่า ฉันเข้าใจว่านี่เป็นพฤติกรรมของ Java คำถามของฉันคือทำไม ? ทำไมความแตกต่างหลากหลายโดยปริยาย แต่เมื่อพูดถึงเรื่องทั่วไปมันจะต้องระบุ?

14
PECS คืออะไร (ผู้ผลิตขยาย Consumer Super)?
ตั้งอยู่ในส่วนที่ไม่ถูกต้องของStack Overflow ที่อยู่ : Использование wildcard ใน Generics Java ฉันเจอ PECS (ย่อมาจากผู้ผลิตextendsและผู้บริโภคsuper ) ในขณะที่อ่านข้อมูลเกี่ยวกับยาชื่อสามัญ มีใครอธิบายให้ฉันรู้วิธีใช้ PECS เพื่อแก้ไขความสับสนระหว่างextendsและsuper?

21
ฉันจะรับคลาสอินสแตนซ์ประเภท T ทั่วไปได้อย่างไร
ฉันได้เรียน Foo&lt;T&gt;generics, ในวิธีการของFooผมต้องการที่จะได้รับเช่นชั้นชนิดแต่ฉันก็ไม่สามารถเรียกTT.class เป็นวิธีที่ต้องการเพื่อรับรอบโดยใช้T.classอะไร
700 java  generics 

16
วิธีรับประเภท T จากสมาชิกของคลาสหรือวิธีการทั่วไป
สมมติว่าฉันมีสมาชิกสามัญในชั้นเรียนหรือวิธีการดังนั้น: public class Foo&lt;T&gt; { public List&lt;T&gt; Bar { get; set; } public void Baz() { // get type of T } } เมื่อผมยกตัวอย่างระดับที่Tจะกลายเป็นเพื่อให้ชั้นเรียนมีคุณสมบัติทั่วไปรายการ:MyTypeObject1 List&lt;MyTypeObject1&gt;เช่นเดียวกับวิธีการทั่วไปในชั้นเรียนที่ไม่ใช่ทั่วไป: public class Foo { public void Bar&lt;T&gt;() { var baz = new List&lt;T&gt;(); // get type of T } } ฉันอยากรู้ว่าวัตถุประเภทใดในรายการชั้นเรียนของฉันมี คุณสมบัติของรายการที่เรียกว่าBarหรือตัวแปรท้องถิ่นbazมีชนิดTใด ฉันทำไม่ได้Bar[0].GetType()เพราะรายการอาจมีองค์ประกอบเป็นศูนย์ ฉันจะทำมันได้อย่างไร
675 c#  .net  generics 


23
ฉันจะจัดการกับคำเตือนการส่งแบบไม่ตรวจสอบได้อย่างไร?
Eclipse ให้คำเตือนแก่ฉันในแบบฟอร์มต่อไปนี้: ความปลอดภัยของประเภท: นักแสดงที่ไม่ได้ตรวจสอบจาก Object ไปยัง HashMap นี่คือจากการเรียกไปยัง API ที่ฉันไม่สามารถควบคุมได้ซึ่งคืนค่า Object: HashMap&lt;String, String&gt; getItems(javax.servlet.http.HttpSession session) { HashMap&lt;String, String&gt; theHash = (HashMap&lt;String, String&gt;)session.getAttribute("attributeKey"); return theHash; } ฉันต้องการหลีกเลี่ยงคำเตือน Eclipse หากเป็นไปได้เนื่องจากในทางทฤษฎีแล้วพวกเขาระบุว่าอาจมีปัญหาโค้ดอย่างน้อย ฉันยังไม่พบวิธีที่ดีในการกำจัดอันนี้ ฉันสามารถแยกบรรทัดเดียวที่เกี่ยวข้องกับวิธีการด้วยตัวเองและเพิ่ม@SuppressWarnings("unchecked")ไปยังวิธีการนั้นจึง จำกัด ผลกระทบของการมีบล็อกของรหัสที่ฉันไม่สนใจคำเตือน ตัวเลือกใดดีกว่า ฉันไม่ต้องการปิดคำเตือนเหล่านี้ใน Eclipse ก่อนที่ฉันจะมาที่รหัสมันง่ายกว่า แต่ก็ยังมีคำเตือนเจ็บใจ: HashMap getItems(javax.servlet.http.HttpSession session) { HashMap theHash = (HashMap)session.getAttribute("attributeKey"); return theHash; } ปัญหาเกิดขึ้นที่อื่นเมื่อคุณพยายามใช้แฮชที่คุณได้รับคำเตือน: HashMap …
611 java  generics  warnings 

26
ฉันจะโคลนรายการทั่วไปใน C # ได้อย่างไร
ฉันมีรายการวัตถุทั่วไปใน C # และต้องการโคลนรายการ รายการภายในรายการมี cloneable list.Clone()แต่มีไม่ได้ดูเหมือนจะเป็นตัวเลือกที่จะทำ มีวิธีง่ายๆในการแก้ไขปัญหานี้หรือไม่?
592 c#  generics  list  clone 

19
ฉันจะทำให้วิธีคืนชนิดทั่วไปได้อย่างไร
ลองพิจารณาตัวอย่างนี้ (โดยทั่วไปในหนังสือ OOP): ฉันมีAnimalชั้นเรียนที่แต่ละคนAnimalสามารถมีเพื่อนมากมาย และ subclasses ชอบDog, Duck, Mouseฯลฯ ที่เพิ่มพฤติกรรมที่เฉพาะเจาะจงเช่นbark(), quack()ฯลฯ นี่คือAnimalคลาส: public class Animal { private Map&lt;String,Animal&gt; friends = new HashMap&lt;&gt;(); public void addFriend(String name, Animal animal){ friends.put(name,animal); } public Animal callFriend(String name){ return friends.get(name); } } และนี่คือตัวอย่างข้อมูลบางส่วนที่มีการพิมพ์ดีดจำนวนมาก: Mouse jerry = new Mouse(); jerry.addFriend("spike", new Dog()); jerry.addFriend("quacker", new Duck()); …

27
สร้างตัวอย่างประเภททั่วไปใน Java?
เป็นไปได้ไหมที่จะสร้างอินสแตนซ์ประเภททั่วไปใน Java ฉันกำลังคิดตามสิ่งที่ฉันเห็นว่าคำตอบคือno( เนื่องจากการลบประเภท ) แต่ฉันจะสนใจถ้าใครสามารถเห็นสิ่งที่ฉันหายไป: class SomeContainer&lt;E&gt; { E createContents() { return what??? } } แก้ไข: ปรากฎว่าสามารถใช้โทเค็นชนิด Superเพื่อแก้ไขปัญหาของฉัน แต่ต้องใช้รหัสที่ใช้การสะท้อนจำนวนมากเนื่องจากคำตอบบางส่วนด้านล่างระบุไว้ ฉันจะออกจากที่นี่ซักครู่เพื่อดูว่ามีใครมาพร้อมกับสิ่งที่แตกต่างจากบทความ Artimaของ Ian Robertson หรือไม่
576 java  generics 

13
ฉันจะคืน NULL จากวิธีการทั่วไปใน C # ได้อย่างไร
ฉันมีวิธีการทั่วไปที่มีรหัส (จำลอง) (ใช่ฉันทราบว่า IList มีภาคแสดง แต่รหัสของฉันไม่ได้ใช้ IList แต่มีการรวบรวมอื่น ๆ แต่นี่ก็ไม่เกี่ยวข้องกับคำถาม ... ) static T FindThing&lt;T&gt;(IList collection, int id) where T : IThing, new() { foreach T thing in collecion { if (thing.Id == id) return thing; } return null; // ERROR: Cannot convert null to type parameter 'T' because it …
546 c#  generics 

7
ทำไม C # ห้ามประเภทแอตทริบิวต์ทั่วไป?
สิ่งนี้ทำให้เกิดข้อยกเว้นเวลาคอมไพล์: public sealed class ValidatesAttribute&lt;T&gt; : Attribute { } [Validates&lt;string&gt;] public static class StringValidation { } ฉันรู้ว่า C # ไม่รองรับคุณสมบัติทั่วไป อย่างไรก็ตามหลังจาก Googling มากฉันไม่สามารถหาเหตุผลได้ ไม่มีใครรู้ว่าทำไมประเภททั่วไปไม่สามารถได้มาจากAttributeไหน? ทฤษฎีใด ๆ

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