ในตัวอย่างนี้:
import java.util.*;
public class Example {
static void doesntCompile(Map<Integer, List<? extends Number>> map) {}
static <T extends Number> void compiles(Map<Integer, List<T>> map) {}
static void function(List<? extends Number> outer)
{
doesntCompile(new HashMap<Integer, List<Integer>>());
compiles(new HashMap<Integer, List<Integer>>());
}
}
doesntCompile()
ไม่สามารถคอมไพล์ด้วย:
Example.java:9: error: incompatible types: HashMap<Integer,List<Integer>> cannot be converted to Map<Integer,List<? extends Number>>
doesntCompile(new HashMap<Integer, List<Integer>>());
^
ขณะcompiles()
ที่คอมไพเลอร์ยอมรับ
คำตอบนี้อธิบายว่าความแตกต่างเพียงอย่างเดียวคือไม่เหมือน<? ...>
กัน<T ...>
ให้คุณอ้างอิงประเภทในภายหลังซึ่งดูเหมือนจะไม่เป็นเช่นนั้น
ความแตกต่างระหว่าง<? extends Number>
และ<T extends Number>
ในกรณีนี้คืออะไรและทำไมไม่รวบรวมครั้งแรก