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

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

3
เลือกพจนานุกรม <T1, T2> ด้วย LINQ
ฉันใช้คีย์เวิร์ด "select" และวิธีการขยายเพื่อส่งคืนIEnumerable&lt;T&gt;ด้วย LINQ แต่ฉันต้องการส่งคืน generic Dictionary&lt;T1, T2&gt;และไม่สามารถหาคำตอบได้ ตัวอย่างฉันเรียนรู้สิ่งนี้จากการใช้บางสิ่งในรูปแบบที่คล้ายกับสิ่งต่อไปนี้: IEnumerable&lt;T&gt; coll = from x in y select new SomeClass{ prop1 = value1, prop2 = value2 }; ฉันทำสิ่งเดียวกันด้วยวิธีการขยาย ฉันคิดว่าเนื่องจากรายการใน a Dictionary&lt;T1, T2&gt;สามารถทำซ้ำได้เนื่องจากKeyValuePair&lt;T1, T2&gt;ฉันสามารถแทนที่ "SomeClass" ในตัวอย่างด้านบนด้วย " new KeyValuePair&lt;T1, T2&gt; { ..." แต่นั่นไม่ได้ผล (คีย์และค่าถูกทำเครื่องหมายว่าอ่านได้อย่างเดียวดังนั้นฉันจึงไม่สามารถรวบรวมรหัสนี้ได้ ) เป็นไปได้หรือฉันต้องทำหลายขั้นตอน? ขอบคุณ
171 c#  .net  linq  generics 

2
ประเภทผลตอบแทนทั่วไปที่ถูกผูกไว้ด้านบน - ส่วนต่อประสานกับชั้นเรียน - รหัสที่ถูกต้องน่าแปลกใจ
นี่คือตัวอย่างในโลกแห่งความเป็นจริงจาก API ไลบรารีบุคคลที่ 3 แต่ง่ายขึ้น คอมไพล์ด้วย Oracle JDK 8u72 พิจารณาทั้งสองวิธี: &lt;X extends CharSequence&gt; X getCharSequence() { return (X) "hello"; } &lt;X extends String&gt; X getString() { return (X) "hello"; } ทั้งคู่รายงานคำเตือน "นักแสดงที่ไม่ได้ตรวจสอบ" - ฉันเข้าใจว่าทำไม สิ่งที่ทำให้ฉันงุนงงคือทำไมฉันถึงโทรได้ Integer x = getCharSequence(); และมันรวบรวม? คอมไพเลอร์ควรจะรู้ว่าไม่ใช้Integer CharSequenceการโทรไป Integer y = getString(); ให้ข้อผิดพลาด (ตามที่คาดไว้) incompatible types: …
171 java  generics  java-8 

7
Mockito.any () ผ่านส่วนต่อประสานกับ Generics
เป็นไปได้ที่จะผ่านประเภทของอินเตอร์เฟซที่มี generics หรือไม่? อินเทอร์เฟซ: public interface AsyncCallback&lt;T&gt; ในวิธีทดสอบของฉัน: Mockito.any(AsyncCallback.class) วาง&lt;ResponseX&gt;ไว้ด้านหลังหรือ.classไม่ทำงาน
171 java  generics  mockito 

4
Func <T> โดยไม่มีพารามิเตอร์
ฉันสามารถส่งเมธอดที่มีพารามิเตอร์ out เป็น Func ได้หรือไม่? public IList&lt;Foo&gt; FindForBar(string bar, out int count) { } // somewhere else public IList&lt;T&gt; Find(Func&lt;string, int, List&lt;T&gt;&gt; listFunction) { } Func ต้องการประเภทเพื่อไม่ให้มีการรวบรวมและการเรียก listFunction ต้องใช้ int และจะไม่อนุญาตให้ใช้ มีวิธีทำเช่นนี้หรือไม่?
167 c#  .net  linq  generics  func 

14
foreach vs someList.ForEach () {}
เห็นได้ชัดว่ามีหลายวิธีในการย้ำผ่านคอลเลกชัน อยากรู้อยากเห็นหากมีความแตกต่างใด ๆ หรือทำไมคุณต้องใช้อีกทางหนึ่งมากกว่า ประเภทแรก: List&lt;string&gt; someList = &lt;some way to init&gt; foreach(string s in someList) { &lt;process the string&gt; } วิธีอื่น ๆ : List&lt;string&gt; someList = &lt;some way to init&gt; someList.ForEach(delegate(string s) { &lt;process the string&gt; }); ฉันเดาว่าส่วนบนของหัวของฉันแทนที่จะเป็นตัวแทนที่ไม่ระบุชื่อที่ฉันใช้ด้านบนคุณจะมีตัวแทนที่นำกลับมาใช้ใหม่ได้คุณสามารถระบุ ...
167 c#  .net  generics  loops  enumeration 

13
วิธีการแปลง int [] ถึง Integer [] ใน Java?
ฉันใหม่กับ Java และสับสนมาก ฉันมีชุดข้อมูลขนาดใหญ่ที่มีความยาว 4 int[]และฉันต้องการนับจำนวนครั้งที่การรวมกันโดยเฉพาะของจำนวนเต็ม 4 ตัวเกิดขึ้น ซึ่งคล้ายกับการนับความถี่คำในเอกสาร ฉันต้องการสร้างMap&lt;int[], double&gt;แผนที่ที่แต่ละ int [] ไปยังจำนวนที่กำลังทำงานอยู่เนื่องจากรายการมีการวนซ้ำ แต่ Map ไม่ได้ใช้ประเภทดั้งเดิม ดังนั้นฉันทำ Map&lt;Integer[], Double&gt; ข้อมูลของฉันถูกเก็บไว้เป็นArrayList&lt;int[]&gt;วนรอบดังนั้นฉันควรเป็นแบบนี้ ArrayList&lt;int[]&gt; data = ... // load a dataset` Map&lt;Integer[], Double&gt; frequencies = new HashMap&lt;Integer[], Double&gt;(); for(int[] q : data) { // **DO SOMETHING TO convert q from int[] to …


7
ฉันจะสร้างประเภทคืนค่าของวิธีการทั่วไปได้อย่างไร
มีวิธีที่จะทำให้วิธีนี้เป็นแบบทั่วไปเพื่อให้ฉันสามารถส่งกลับสตริง, บูล, int หรือสองครั้ง? ตอนนี้มันส่งคืนสตริง แต่ถ้าสามารถหาค่า "จริง" หรือ "เท็จ" เป็นค่ากำหนดได้ฉันต้องการคืนค่าบูลเช่น public static string ConfigSetting(string settingName) { return ConfigurationManager.AppSettings[settingName]; }
166 c#  .net  generics  return-type 

2
คีย์เวิร์ด reified ใน Kotlin ทำงานอย่างไร
ฉันพยายามทำความเข้าใจจุดประสงค์ของreifiedคำหลักดูเหมือนว่ามันช่วยให้เราสามารถไตร่ตรองเกี่ยวกับยาสามัญได้ อย่างไรก็ตามเมื่อฉันปล่อยมันออกไปมันก็ใช้งานได้ดี ใครสนใจที่จะอธิบายเมื่อสิ่งนี้สร้างความแตกต่างที่แท้จริง?

9
วิธีสร้างคลาส Java ที่ใช้หนึ่งอินเตอร์เฟสที่มีสองประเภททั่วไป?
ฉันมีอินเทอร์เฟซทั่วไป public interface Consumer&lt;E&gt; { public void consume(E e); } ฉันมีคลาสที่ใช้วัตถุสองประเภทดังนั้นฉันต้องการทำสิ่งที่ชอบ: public class TwoTypesConsumer implements Consumer&lt;Tomato&gt;, Consumer&lt;Apple&gt; { public void consume(Tomato t) { ..... } public void consume(Apple a) { ...... } } เห็นได้ชัดว่าฉันไม่สามารถทำเช่นนั้นได้ แน่นอนฉันสามารถใช้การจัดส่งได้เองเช่น public class TwoTypesConsumer implements Consumer&lt;Object&gt; { public void consume(Object o) { if (o instanceof Tomato) …

11
ฉันจะใช้ส่วนต่อประสานเป็นข้อ จำกัด ประเภท C # ทั่วไปได้อย่างไร
มีวิธีรับฟังก์ชั่นการประกาศต่อไปนี้หรือไม่? public bool Foo&lt;T&gt;() where T : interface; กล่าวคือ โดยที่ T เป็นประเภทอินเตอร์เฟส (คล้ายกับwhere T : classและstruct) ขณะนี้ฉันได้ตัดสิน: public bool Foo&lt;T&gt;() where T : IBase; ที่ IBase ถูกกำหนดให้เป็นอินเตอร์เฟสว่างที่สืบทอดโดยอินเตอร์เฟสแบบกำหนดเองทั้งหมดของฉัน ... ไม่เหมาะ แต่ควรใช้งานได้ ... ทำไมคุณไม่สามารถกำหนดประเภททั่วไปต้องเป็นส่วนติดต่อได้ สำหรับสิ่งที่คุ้มค่าฉันต้องการสิ่งนี้เพราะFooทำสิ่งที่ต้องการอินเทอร์เฟซชนิด ... ฉันสามารถส่งมันเป็นพารามิเตอร์ปกติและทำการตรวจสอบที่จำเป็นในฟังก์ชั่นของตัวเอง สมมติว่ามีประสิทธิภาพมากกว่านี้เล็กน้อยเนื่องจากการตรวจสอบทั้งหมดเสร็จสิ้นในเวลารวบรวม)

4
การทำให้เป็นจริงคืออะไร?
ฉันรู้ว่า Java ใช้ตัวแปรหลากหลาย (Generics) กับการลบ ฉันเข้าใจว่าการลบคืออะไร ฉันรู้ว่า C # ใช้ตัวแปรความแปรปรวนร่วมกับการทำให้เป็นจริง ฉันรู้ว่าสามารถทำให้คุณเขียน public void dosomething(List&lt;String&gt; input) {} public void dosomething(List&lt;Int&gt; input) {} หรือว่าคุณสามารถรู้ตอนรันไทม์พารามิเตอร์ประเภทของบางประเภทพารามิเตอร์คืออะไร แต่ฉันไม่เข้าใจว่ามันคืออะไร ประเภท reified คืออะไร? ค่า reified คืออะไร? จะเกิดอะไรขึ้นเมื่อมีการแก้ไขประเภท / ค่า
163 c#  generics  reification 

8
เหตุใดอาร์เรย์ของโควาเรียนท์ แต่ยาสามัญมีค่าคงที่?
จาก Java ที่มีประสิทธิภาพโดย Joshua Bloch อาร์เรย์แตกต่างจากประเภททั่วไปในสองวิธีที่สำคัญ อาร์เรย์แรกเป็น covariant ยาสามัญมีค่าคงที่ Covariant นั้นหมายถึงว่าถ้า X เป็นชนิดย่อยของ Y ดังนั้น X [] ก็จะเป็นประเภทย่อยของ Y [] อาร์เรย์เป็น covariant เนื่องจากสตริงเป็นชนิดย่อยของ Object So String[] is subtype of Object[] ค่าคงที่นั้นหมายถึงโดยไม่คำนึงว่า X เป็นชนิดย่อยของ Y หรือไม่ List&lt;X&gt; will not be subType of List&lt;Y&gt;. คำถามของฉันคือทำไมการตัดสินใจที่จะทำให้อาร์เรย์ covariant ใน Java? มีการโพสต์ SO อื่น ๆ …

7
C # สร้างใหม่ T ()
คุณสามารถเห็นสิ่งที่ฉันพยายาม (แต่ล้มเหลว) จะทำอย่างไรกับรหัสต่อไปนี้: protected T GetObject() { return new T(); } ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก. แก้ไข: บริบทมีดังนี้ ฉันเล่นกับคลาสคอนโทรลเลอร์ที่กำหนดเองเพื่อให้คอนโทรลเลอร์ทั้งหมดได้มาด้วยวิธีมาตรฐาน ดังนั้นในบริบทฉันต้องการสร้างอินสแตนซ์ใหม่ของวัตถุประเภทตัวควบคุม ดังนั้นในช่วงเวลาของการเขียนมันเป็นสิ่งที่ชอบ: public class GenericController&lt;T&gt; : Controller { ... protected T GetObject() { return (T)Activator.CreateInstance(ObjectType); } public ActionResult Create() { var obj = GetObject() return View(obj); } ดังนั้นฉันจึงตัดสินใจว่าการสะท้อนนั้นง่ายที่สุดที่นี่ ฉันเห็นด้วยอย่างแน่นอนเมื่อได้รับข้อความเริ่มต้นของคำถามคำตอบที่เหมาะสมที่สุดในการทำเครื่องหมายว่าถูกต้องคือคำที่ใช้ข้อ จำกัด ใหม่ () ฉันได้แก้ไขแล้ว
159 c#  .net  generics  c#-4.0  .net-4.0 

14
ฉันจะโคลนรายการทั่วไปใน Java ได้อย่างไร
ฉันมีสิ่งArrayList&lt;String&gt;ที่ฉันต้องการคืนสำเนา ArrayListมีวิธีการโคลนซึ่งมีลายเซ็นดังต่อไปนี้: public Object clone() หลังจากที่ฉันเรียกเมธอดนี้ฉันจะเหวี่ยง Object ที่ส่งคืนกลับไปได้ArrayList&lt;String&gt;อย่างไร

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