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

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

18
ผ่านรายการเดียวเป็น IEnumerable <T>
มีวิธีการทั่วไปในการส่งรายการประเภทเดียวTไปยังวิธีที่คาดว่า IEnumerable&lt;T&gt;พารามิเตอร์หรือไม่ ภาษาคือ C #, กรอบงานเวอร์ชัน 2.0 ขณะนี้ฉันกำลังใช้วิธีผู้ช่วย (เป็น. Net 2.0 ดังนั้นฉันจึงมีวิธีการคัดเลือก / ฉายผู้ช่วยที่คล้ายกับ LINQ ทั้งหมด) แต่วิธีนี้ดูเหมือนโง่: public static class IEnumerableExt { // usage: IEnumerableExt.FromSingleItem(someObject); public static IEnumerable&lt;T&gt; FromSingleItem&lt;T&gt;(T item) { yield return item; } } วิธีการอื่น ๆ ของหลักสูตรจะมีการสร้างและเติมList&lt;T&gt;หรือและผ่านมันแทนArrayIEnumerable&lt;T&gt; [แก้ไข]เป็นวิธีการขยายอาจตั้งชื่อ: public static class IEnumerableExt { // usage: someObject.SingleItemAsEnumerable(); public static …
377 c#  .net  generics  ienumerable 

22
มีข้อ จำกัด ที่ จำกัด วิธีการทั่วไปของฉันเป็นประเภทตัวเลขหรือไม่?
ทุกคนสามารถบอกฉันว่ามีวิธีที่มี generics เพื่อ จำกัด การโต้แย้งประเภททั่วไปTเพียง: Int16 Int32 Int64 UInt16 UInt32 UInt64 ฉันตระหนักถึงwhereคำหลัก แต่ไม่สามารถหาอินเตอร์เฟซสำหรับเพียงประเภทเหล่านี้ สิ่งที่ต้องการ: static bool IntegerFunction&lt;T&gt;(T value) where T : INumeric
364 c#  generics  constraints 

12
ไม่สามารถใช้โอเปอเรเตอร์ == กับประเภททั่วไปใน C # ได้หรือไม่
ตามเอกสารของ==ผู้ประกอบการในMSDN , สำหรับประเภทค่าที่กำหนดไว้ล่วงหน้าตัวดำเนินการความเท่าเทียมกัน (==) จะส่งกลับค่าจริงถ้าค่าของตัวถูกดำเนินการเท่ากันเท็จมิฉะนั้น สำหรับชนิดการอ้างอิงอื่นที่ไม่ใช่สตริง == จะส่งกลับค่าจริงถ้าตัวถูกดำเนินการทั้งสองอ้างถึงวัตถุเดียวกัน สำหรับประเภทสตริง == เปรียบเทียบค่าของสตริง ประเภทค่าที่ผู้ใช้กำหนดสามารถโอเวอร์โหลดตัวดำเนินการ == (ดูโอเปอเรเตอร์) ดังนั้นประเภทการอ้างอิงที่ผู้ใช้กำหนดสามารถทำได้ โดยค่าเริ่มต้น == จะทำงานตามที่อธิบายไว้ข้างต้นสำหรับทั้งประเภทการอ้างอิงที่กำหนดไว้ล่วงหน้าและที่ผู้ใช้กำหนด เหตุใดข้อมูลโค้ดนี้จึงไม่สามารถรวบรวมได้ bool Compare&lt;T&gt;(T x, T y) { return x == y; } ฉันได้รับข้อผิดพลาดผู้ประกอบการ '==' ไม่สามารถนำไปใช้กับตัวถูกดำเนินการชนิด 'T' และ 'T' ฉันสงสัยว่าเพราะเท่าที่ฉันเข้าใจตัว==ดำเนินการที่กำหนดไว้ล่วงหน้าสำหรับทุกประเภท? แก้ไข:ขอบคุณทุกคน ตอนแรกฉันไม่ได้สังเกตว่าคำสั่งนั้นเกี่ยวกับประเภทการอ้างอิงเท่านั้น ฉันยังคิดว่าการเปรียบเทียบแบบทีละบิตมีไว้สำหรับค่าทุกประเภทซึ่งตอนนี้ฉันรู้ว่าไม่ถูกต้อง แต่ในกรณีที่ฉันใช้ประเภทอ้างอิงตัว==ดำเนินการจะใช้การเปรียบเทียบการอ้างอิงที่กำหนดไว้ล่วงหน้าหรือจะใช้ตัวดำเนินการรุ่นที่มีการโอเวอร์โหลดของผู้ประกอบการหรือไม่ แก้ไข 2:จากการทดลองและข้อผิดพลาดเราเรียนรู้ว่า==ผู้ประกอบการจะใช้การเปรียบเทียบการอ้างอิงที่กำหนดไว้ล่วงหน้าเมื่อใช้ประเภททั่วไปที่ไม่ จำกัด ที่จริงแล้วคอมไพเลอร์จะใช้วิธีการที่ดีที่สุดที่จะหาอาร์กิวเมนต์ประเภทที่ จำกัด แต่จะไม่ดูเพิ่มเติม ตัวอย่างเช่นรหัสด้านล่างจะพิมพ์ทุกtrueครั้งแม้ว่าTest.test&lt;B&gt;(new B(), new …

16
ตรวจสอบว่าคลาสนั้นมาจากคลาสทั่วไปหรือไม่
ฉันมีชั้นเรียนทั่วไปในโครงการของฉันกับชั้นเรียนที่ได้รับ public class GenericClass&lt;T&gt; : GenericInterface&lt;T&gt; { } public class Test : GenericClass&lt;SomeType&gt; { } มีวิธีใดบ้างที่จะทราบว่าTypeวัตถุนั้นได้มาจากGenericClassอะไร? t.IsSubclassOf(typeof(GenericClass&lt;&gt;)) ไม่ทำงาน, ไม่เป็นผล.
309 c#  generics  reflection 

8
IEnumerable และ Recursion โดยใช้ผลตอบแทน
ฉันมีIEnumerable&lt;T&gt;วิธีที่ฉันใช้เพื่อค้นหาการควบคุมในหน้า WebForms วิธีการแบบเรียกซ้ำและฉันมีปัญหาบางอย่างกลับประเภทที่ฉันต้องการเมื่อyield returnเป็นคืนค่าของการโทรซ้ำ รหัสของฉันมีลักษณะดังนี้: public static IEnumerable&lt;Control&gt; GetDeepControlsByType&lt;T&gt;(this Control control) { foreach(Control c in control.Controls) { if (c is T) { yield return c; } if(c.Controls.Count &gt; 0) { yield return c.GetDeepControlsByType&lt;T&gt;(); } } } ขณะนี้มีข้อผิดพลาด "ไม่สามารถแปลงประเภทการแสดงออก" หากอย่างไรก็ตามวิธีการนี้จะคืนค่าชนิดIEnumerable&lt;Object&gt;รหัสจะสร้างขึ้น แต่จะส่งคืนชนิดที่ไม่ถูกต้องในผลลัพธ์ มีวิธีใช้yield returnในขณะที่ใช้การเรียกซ้ำหรือไม่

8
Java generics - ทำไม“ ขยาย T” อนุญาต แต่ไม่“ ใช้ T”
ฉันสงสัยว่ามีเหตุผลพิเศษใน Java ที่ใช้เสมอ " extends" มากกว่า " implements" เพื่อกำหนดขอบเขตของพารามิเตอร์ ตัวอย่าง: public interface C {} public class A&lt;B implements C&gt;{} เป็นสิ่งต้องห้าม แต่ public class A&lt;B extends C&gt;{} ถูกต้อง. อะไรคือเหตุผลสำหรับสิ่งนั้น?



13
การเปรียบเทียบค่า Null หรือค่าดีฟอลต์ของอาร์กิวเมนต์ทั่วไปใน C #
ฉันมีวิธีการทั่วไปที่กำหนดไว้เช่นนี้: public void MyMethod&lt;T&gt;(T myArgument) สิ่งแรกที่ฉันต้องการทำคือตรวจสอบว่าค่าของ myArgument เป็นค่าเริ่มต้นสำหรับประเภทนั้นหรือไม่ดังนี้: if (myArgument == default(T)) แต่นี่ไม่ได้รวบรวมเพราะฉันไม่ได้รับประกันว่า T จะใช้ตัวดำเนินการ == ดังนั้นฉันจึงเปลี่ยนรหัสเป็น: if (myArgument.Equals(default(T))) ตอนนี้การคอมไพล์ แต่จะล้มเหลวหาก myArgument เป็นโมฆะซึ่งเป็นส่วนหนึ่งของสิ่งที่ฉันกำลังทดสอบ ฉันสามารถเพิ่มการตรวจสอบ null อย่างชัดเจนเช่นนี้: if (myArgument == null || myArgument.Equals(default(T))) ตอนนี้ฉันรู้สึกซ้ำซ้อน ReSharper ยังแนะนำให้ฉันเปลี่ยน myArgument == ส่วนที่ว่างเป็น myArgument == default (T) ซึ่งเป็นที่ที่ฉันเริ่ม มีวิธีที่ดีกว่าในการแก้ปัญหานี้หรือไม่? ฉันต้องการสนับสนุนทั้งประเภทการอ้างอิงและประเภทค่า
288 c#  generics 

11
ชนิดที่ Nullable เป็นพารามิเตอร์ทั่วไปได้หรือไม่
ฉันต้องการทำสิ่งนี้: myYear = record.GetValueOrNull&lt;int?&gt;("myYear"), สังเกตเห็นว่า nullable type เป็นพารามิเตอร์ทั่วไป เนื่องจากGetValueOrNullฟังก์ชั่นสามารถคืนค่า null ความพยายามครั้งแรกของฉันคือ: public static T GetValueOrNull&lt;T&gt;(this DbDataRecord reader, string columnName) where T : class { object columnValue = reader[columnName]; if (!(columnValue is DBNull)) { return (T)columnValue; } return null; } แต่ข้อผิดพลาดที่ฉันได้รับตอนนี้คือ: ประเภท 'int?' ต้องเป็นประเภทอ้างอิงเพื่อใช้เป็นพารามิเตอร์ 'T' ในประเภทหรือวิธีการทั่วไป ขวา! Nullable&lt;int&gt;คือstruct! ดังนั้นฉันจึงพยายามเปลี่ยนข้อ จำกัด ของคลาสเป็นstructข้อ …
288 c#  generics 

6
การใช้ Mockito เพื่อจำลองคลาสด้วยพารามิเตอร์ทั่วไป
มีวิธีทำความสะอาดแบบจำลองคลาสด้วยพารามิเตอร์ทั่วไปหรือไม่? ว่าฉันมีจะเยาะเย้ยชั้นเรียนซึ่งผมต้องผ่านเข้าไปในวิธีการที่คาดว่าจะเป็นFoo&lt;T&gt; Foo&lt;Bar&gt;ฉันสามารถทำสิ่งต่อไปนี้ได้ง่ายพอ: Foo mockFoo = mock(Foo.class); when(mockFoo.getValue).thenReturn(new Bar()); สมมติว่าผลตอบแทนประเภททั่วไปgetValue() แต่ที่จะมีลูกแมวเมื่อผมมารู้ทีหลังผ่านมันเข้าไปในวิธีการที่คาดหวังว่าT Foo&lt;Bar&gt;การคัดเลือกเป็นวิธีการเดียวในการทำเช่นนี้หรือไม่?
280 java  generics  mockito 

5
Scala ประเภทที่สูงกว่าคืออะไร
คุณสามารถค้นหาสิ่งต่อไปนี้บนเว็บ: ประเภทที่สูงขึ้นชนิด == ตัวสร้างประเภท? class AClass[T]{...} // For example, class List[T] บางคนบอกว่านี่เป็นประเภทที่สูงกว่าเพราะมันเป็นนามธรรมมากกว่าประเภทซึ่งจะสอดคล้องกับคำนิยาม ประเภทที่สูงขึ้นเป็นประเภทที่ใช้ประเภทอื่น ๆ และสร้างประเภทใหม่ แม้ว่าเหล่านี้เป็นที่รู้จักกันเป็นประเภทคอนสตรัค (ตัวอย่างเช่นในการเขียนโปรแกรมใน Scala ) typeed type ที่สูงขึ้น == type constructor ซึ่งใช้ตัวสร้าง type เป็นพารามิเตอร์ type? ในGenericsกระดาษชนิดที่สูงขึ้นคุณสามารถอ่าน ... ประเภทที่เป็นนามธรรมมากกว่าประเภทที่เป็นนามธรรมมากกว่าประเภท ('ประเภทที่สูงกว่าประเภท') ... " ซึ่งแสดงให้เห็นว่า class XClass[M[T]]{...} // or trait YTrait[N[_]]{...} // e.g. trait Functor[F[_]] เป็นประเภทที่สูงขึ้น ดังนั้นด้วยนี้ในใจมันเป็นเรื่องยากที่จะแยกแยะระหว่างประเภทคอนสตรัค , ประเภท …

17
อะไรคือสาเหตุที่ฉันไม่สามารถสร้างประเภทอาร์เรย์ทั่วไปใน Java ได้
เหตุผลที่ Java ไม่อนุญาตให้เราทำอะไร private T[] elements = new T[initialCapacity]; ฉันสามารถเข้าใจ. NET ไม่อนุญาตให้เราทำเช่นนั้นใน. NET คุณมีประเภทค่าที่เวลาทำงานสามารถมีขนาดแตกต่างกัน แต่ใน Java T ทุกชนิดจะเป็นการอ้างอิงวัตถุจึงมีขนาดเดียวกัน ( ช่วยแก้ให้ด้วยนะถ้าฉันผิด). เหตุผลคืออะไร

3
Collections.emptyList () ส่งคืนรายการ <Object> หรือไม่
ฉันมีปัญหาในการนำทางกฎของ Java สำหรับอนุมานพารามิเตอร์ประเภททั่วไป พิจารณาคลาสต่อไปนี้ซึ่งมีพารามิเตอร์รายการทางเลือก: import java.util.Collections; import java.util.List; public class Person { private String name; private List&lt;String&gt; nicknames; public Person(String name) { this(name,Collections.emptyList()); } public Person(String name,List&lt;String&gt; nicknames) { this.name = name; this.nicknames = nicknames; } } คอมไพเลอร์ Java ของฉันมีข้อผิดพลาดดังต่อไปนี้: Person.java:9: The constructor Person(String, List&lt;Object&gt;) is undefined แต่Collections.emptyList()ผลตอบแทนที่พิมพ์ไม่ได้&lt;T&gt; List&lt;T&gt; List&lt;Object&gt;การเพิ่มนักแสดงไม่ได้ช่วยอะไร …

14
รับ java.util.List ประเภททั่วไป
ฉันมี; List&lt;String&gt; stringList = new ArrayList&lt;String&gt;(); List&lt;Integer&gt; integerList = new ArrayList&lt;Integer&gt;(); มีวิธี (ง่าย) ในการดึงประเภททั่วไปของรายการหรือไม่?
262 java  generics 

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