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

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

13
เหตุใดบางคนจึงอ้างว่าการใช้งานทั่วไปของ Java ไม่ดี
บางครั้งฉันได้ยินมาว่าด้วย generics Java ไม่ถูกต้อง (อ้างอิงที่ใกล้ที่สุดที่นี่ ) ให้อภัยในความไม่มีประสบการณ์ของฉัน แต่อะไรจะทำให้พวกเขาดีขึ้น?
115 java  generics 

7
“ ชั้นเรียนพิเศษ” คืออะไร?
หลังจากล้มเหลวในการรวบรวมสิ่งต่อไปนี้: public class Gen<T> where T : System.Array { } ด้วยข้อผิดพลาด ข้อ จำกัด ไม่สามารถเป็นคลาสพิเศษได้ `` System.Array '' ผมเริ่มสงสัยว่าสิ่งที่เป็น "การเรียนพิเศษ"? ผู้คนมักจะได้รับข้อผิดพลาดประเภทเดียวกันเมื่อพวกเขาระบุSystem.Enumในข้อ จำกัด ทั่วไป ผมได้รับผลเช่นเดียวกันกับSystem.Object, System.Delegate, System.MulticastDelegateและSystem.ValueTypeมากเกินไป มีมากกว่านี้ไหม ฉันไม่พบข้อมูลใด ๆ เกี่ยวกับ "ชั้นเรียนพิเศษ" ใน C # นอกจากนี้สิ่งที่เป็นพิเศษเกี่ยวกับการเรียนที่เราไม่สามารถใช้พวกเขาเป็นข้อ จำกัด ประเภททั่วไป?

5
ส่งคืนวัตถุ Void
อะไรคือวิธีที่ถูกต้องในการส่งคืนVoidประเภทเมื่อไม่ใช่แบบดั้งเดิม เช่น. ปัจจุบันฉันใช้ null ดังต่อไปนี้ interface B<E>{ E method(); } class A implements B<Void>{ public Void method(){ // do something return null; } }

2
C # generic "where constraint" กับ "any generic type"?
ขอยกตัวอย่าง: ฉันมีนิยามคลาส / อินเทอร์เฟซทั่วไป: interface IGenericCar< T > {...} ฉันมีคลาส / อินเทอร์เฟซอื่นที่ฉันต้องการเชื่อมโยงกับคลาสด้านบนเช่น: interface IGarrage< TCar > : where TCar: IGenericCar< (**any type here**) > {...} โดยพื้นฐานแล้วฉันต้องการให้ IGarrage ทั่วไปของฉันขึ้นอยู่กับIGenericCarไม่ว่าจะเป็นIGenericCar<int>หรือIGenericCar<System.Color>เพราะฉันไม่มีการพึ่งพาประเภทนั้นก็ตาม

2
ไม่เลือก Java: ไม่ได้เลือกการสร้างอาร์เรย์ทั่วไปสำหรับพารามิเตอร์ varargs
ฉันได้ตั้งค่า Netbeans ให้แสดงคำเตือนที่ไม่ได้ตรวจสอบในโค้ด Java ของฉัน แต่ฉันไม่เข้าใจข้อผิดพลาดในบรรทัดต่อไปนี้: private List<String> cocNumbers; private List<String> vatNumbers; private List<String> ibans; private List<String> banks; ... List<List<String>> combinations = Utils.createCombinations(cocNumbers, vatNumbers, ibans); ให้: [unchecked] unchecked generic array creation for varargs parameter of type List<String>[] แหล่งที่มาของวิธีการ: /** * Returns a list of all possible combinations of the entered …

14
วิธีการเริ่มต้นรายการ <T> เป็นขนาดที่กำหนด (เมื่อเทียบกับความจุ)
.NET นำเสนอคอนเทนเนอร์รายการทั่วไปที่มีประสิทธิภาพเกือบเหมือนกัน (ดูคำถามประสิทธิภาพของอาร์เรย์เทียบกับรายการ) อย่างไรก็ตามมันค่อนข้างแตกต่างกันในการเริ่มต้น อาร์เรย์เป็นเรื่องง่ายมากที่จะเริ่มต้นด้วยค่าเริ่มต้นและตามความหมายพวกเขามีขนาดที่แน่นอนแล้ว: string[] Ar = new string[10]; ซึ่งช่วยให้สามารถกำหนดรายการแบบสุ่มได้อย่างปลอดภัยพูดว่า: Ar[5]="hello"; ด้วยรายการสิ่งที่ยุ่งยากกว่า ฉันสามารถเห็นสองวิธีในการเริ่มต้นเดียวกันซึ่งทั้งสองวิธีนี้ไม่ใช่สิ่งที่คุณเรียกว่าสง่างาม: List&lt;string&gt; L = new List&lt;string&gt;(10); for (int i=0;i&lt;10;i++) L.Add(null); หรือ string[] Ar = new string[10]; List&lt;string&gt; L = new List&lt;string&gt;(Ar); อะไรจะเป็นวิธีที่สะอาดกว่านี้? แก้ไข: คำตอบจนถึงตอนนี้อ้างถึงความจุซึ่งเป็นอย่างอื่นที่ไม่ใช่การเติมรายการล่วงหน้า ตัวอย่างเช่นในรายการที่เพิ่งสร้างขึ้นโดยมีความจุ 10 รายการไม่สามารถทำได้L[2]="somevalue" แก้ไข 2: ผู้คนสงสัยว่าทำไมฉันถึงต้องการใช้รายการด้วยวิธีนี้เนื่องจากไม่ใช่วิธีที่พวกเขาตั้งใจจะใช้ ฉันเห็นเหตุผลสองประการ: คนหนึ่งสามารถโต้แย้งได้อย่างน่าเชื่อว่ารายการเป็นอาร์เรย์ "รุ่นต่อไป" โดยเพิ่มความยืดหยุ่นโดยแทบไม่มีการลงโทษ ดังนั้นควรใช้เป็นค่าเริ่มต้น ฉันกำลังชี้ให้เห็นว่าอาจไม่ง่ายในการเริ่มต้น สิ่งที่ฉันกำลังเขียนอยู่คือคลาสพื้นฐานที่มีฟังก์ชันการทำงานเริ่มต้นซึ่งเป็นส่วนหนึ่งของเฟรมเวิร์กที่ใหญ่กว่า …

4
Lambda Expression และวิธีการทั่วไป
สมมติว่าฉันมีอินเทอร์เฟซทั่วไป: interface MyComparable&lt;T extends Comparable&lt;T&gt;&gt; { public int compare(T obj1, T obj2); } และวิธีการsort: public static &lt;T extends Comparable&lt;T&gt;&gt; void sort(List&lt;T&gt; list, MyComparable&lt;T&gt; comp) { // sort the list } ฉันสามารถเรียกใช้วิธีนี้และส่งนิพจน์แลมบ์ดาเป็นอาร์กิวเมนต์: List&lt;String&gt; list = Arrays.asList("a", "b", "c"); sort(list, (a, b) -&gt; a.compareTo(b)); ที่จะทำงานได้ดี แต่ตอนนี้ถ้าฉันทำให้อินเทอร์เฟซไม่ใช่แบบทั่วไปและวิธีการทั่วไป: interface MyComparable { public &lt;T extends …
111 java  generics  lambda  java-8 

7
C # ข้อ จำกัด ประเภททั่วไปสำหรับทุกสิ่งที่เป็นโมฆะ
ดังนั้นฉันจึงมีคลาสนี้: public class Foo&lt;T&gt; where T : ??? { private T item; public bool IsNull() { return item == null; } } ตอนนี้ฉันกำลังมองหาข้อ จำกัด nullประเภทที่ช่วยให้ผมใช้ทุกอย่างที่เป็นพารามิเตอร์ชนิดที่สามารถ นั่นหมายถึงประเภทการอ้างอิงทั้งหมดรวมถึงประเภทNullable( T?) ทั้งหมด: Foo&lt;String&gt; ... = ... Foo&lt;int?&gt; ... = ... ควรจะเป็นไปได้ การใช้classเป็นข้อ จำกัด ประเภททำให้ฉันใช้ประเภทอ้างอิงเท่านั้น ข้อมูลเพิ่มเติม: ฉันกำลังเขียนแอปพลิเคชั่นไปป์และฟิลเตอร์และต้องการใช้nullข้อมูลอ้างอิงเป็นรายการสุดท้ายที่ผ่านเข้าไปในไปป์ไลน์เพื่อให้ตัวกรองทุกตัวสามารถปิดได้อย่างสวยงามทำการล้างข้อมูล ฯลฯ ...
111 c#  generics  nullable 

7
วิธีใช้ TypeToken + generics กับ Gson ใน Kotlin
ฉันไม่สามารถรับรายการประเภททั่วไปจากคลาสที่กำหนดเองได้ (เทิร์น): val turnsType = TypeToken&lt;List&lt;Turns&gt;&gt;() {}.type val turns = Gson().fromJson(pref.turns, turnsType) มันกล่าวว่า: cannot access '&lt;init&gt;' it is 'public /*package*/' in 'TypeToken'

1
อะไรคือความแตกต่างระหว่าง '&' และ ',' ใน Java generics?
ในขณะที่อ่านบทช่วยสอนอย่างเป็นทางการของ Java เกี่ยวกับ generics ฉันพบว่าคุณสามารถ จำกัด อาร์กิวเมนต์ type (ในกรณีนี้คือT) เพื่อขยายคลาสและ / หรืออินเทอร์เฟซเพิ่มเติมด้วยตัวดำเนินการ 'และ' ( &amp;) ดังนี้: &lt;T extends MyClass &amp; Serializable&gt; ฉันแทนที่&amp;ด้วย,(โดยไม่ได้ตั้งใจและยังใช้งานได้พร้อมคำเตือนเล็กน้อย) คำถามของฉันคือมีความแตกต่างระหว่างสองสิ่งนี้หรือไม่: &lt;T extends MyClass &amp; Serializable&gt; &lt;T extends MyClass , Serializable&gt; // here is with comma และวิธีการตัวอย่าง: static &lt;T extends MyClass &amp; Serializable&gt; ArrayList&lt;T&gt; fromArrayToCollection(T[] a) { ArrayList&lt;T&gt; …
110 java  generics 

6
Java Generics (สัญลักษณ์แทน)
ฉันมีคำถามสองสามข้อเกี่ยวกับไวด์การ์ดทั่วไปใน Java: อะไรคือความแตกต่างระหว่างList&lt;? extends T&gt;และList&lt;? super T&gt;? wildcard ที่มีขอบเขตคืออะไรและ wildcard ที่ไม่มีขอบเขตคืออะไร?

5
Kotlin: วิธีใช้งาน List casts: Unchecked Cast: kotlin.collections.List <Kotlin.Any?> ไปยัง kotlin.colletions.List <Waypoint>
ฉันต้องการเขียนฟังก์ชันที่ส่งคืนทุกรายการในรายการListที่ไม่ใช่รายการแรกหรือรายการสุดท้าย (a via point) ฟังก์ชันได้รับข้อมูลทั่วไปList&lt;*&gt;เป็นอินพุต ควรส่งคืนผลลัพธ์ก็ต่อเมื่อองค์ประกอบของรายการเป็นประเภทWaypoint: fun getViaPoints(list: List&lt;*&gt;): List&lt;Waypoint&gt;? { list.forEach { if(it !is Waypoint ) return null } val waypointList = list as? List&lt;Waypoint&gt; ?: return null return waypointList.filter{ waypointList.indexOf(it) != 0 &amp;&amp; waypointList.indexOf(it) != waypointList.lastIndex} } เมื่อส่งList&lt;*&gt;ไปList&lt;Waypoint&gt;ฉันได้รับคำเตือน: Unchecked Cast: kotlin.collections.List to kotlin.colletions.List ฉันไม่สามารถหาวิธีนำไปใช้เป็นอย่างอื่นได้ อะไรคือวิธีที่ถูกต้องในการใช้ฟังก์ชันนี้โดยไม่มีคำเตือนนี้
108 list  generics  casting  kotlin 


3
ฉันจะรับชื่อประเภทของอาร์กิวเมนต์ประเภททั่วไปได้อย่างไร
ถ้าฉันมีลายเซ็นวิธีเช่น public string myMethod&lt;T&gt;( ... ) ฉันจะรับชื่อประเภทที่กำหนดเป็นอาร์กิวเมนต์ประเภทภายในเมธอดได้อย่างไร อยากทำอะไรคล้าย ๆ กันtypeof(T).FullNameแต่ได้ผลจริง ...
108 c#  generics 

8
Java Class.cast () เทียบกับตัวดำเนินการ cast
หลังจากได้รับการสอนในช่วงวัน C ++ ของฉันเกี่ยวกับความชั่วร้ายของตัวดำเนินการแบบ C-style ฉันรู้สึกยินดีในตอนแรกที่พบว่าใน Java 5 java.lang.Classได้รับcastวิธีการ ฉันคิดว่าในที่สุดเราก็มีวิธีจัดการกับการแคสติ้งแบบ OO ปรากฎว่าClass.castไม่เหมือนกับstatic_castใน C ++ reinterpret_castมันเป็นเหมือน จะไม่สร้างข้อผิดพลาดในการคอมไพล์ตามที่คาดไว้และจะเลื่อนไปที่รันไทม์แทน นี่คือกรณีทดสอบง่ายๆเพื่อแสดงพฤติกรรมที่แตกต่างกัน package test; import static org.junit.Assert.assertTrue; import org.junit.Test; public class TestCast { static final class Foo { } static class Bar { } static final class BarSubclass extends Bar { } @Test public void …

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