Можете ли вы объяснить, почему работает следующее?Статические общие методы
public class GenericsTest<T> {
public void doSomething(T v1, T v2) {
}
public static <T> void doSomethingStatic(T v1, T v2) {
}
public static <T> void doSomethingStaticList(List<T> v1, List<T> v2)
{
}
public static void main(String[] args) {
GenericsTest<String> gt = new GenericsTest<>();
// OK
gt.doSomething("abc", "abc");
// Not OK
gt.doSomething(1, "abc");
// OK
doSomethingStatic(1, 2);
// Still OK
doSomethingStatic(1, "abc");
// So why is this not OK?
List<String> list1=new LinkedList<>();
List<Integer> list2=new LinkedList<>();
doSomethingStaticList(list1,list2);
}
}
T v1, T v2
должны быть того же типа в doSomethingStatic
, но я до сих пор в состоянии передавать различные типы (целые и строки).
Если doSomethingStatic()
принимает общий суперкласс по умолчанию, почему doSomethingStaticList()
не работает с разными типами?
В 'public static void doSomethingStatic (T v1, T v2) {', переменная типа не нужна: она семантически идентична public public void doSomethingStatic (Object v1, Object v2) {'. –
К обновлению: потому что нет 'T', который бы соответствовал обоим типам. Единственным типом, который будет соответствовать обоим спискам, является тип «List», но не существует «Список». –
Hulk
В случае списков, какой тип суперкласса был бы 'T', чтобы сделать их действительными? Не забывайте, что дженерики являются инвариантными, и вы не можете назначить «Список» на «Список