import java.util.* ;
class Ideone {
private static class Pair< T> {
private T first;
private T second;
public Pair( T first, T second) {
this .first = first;
this .second = second;
}
public void setFirst( T first) {
this .first = first;
}
public void setSecond( T second) {
this .second = second;
}
public T getFirst( ) {
return first;
}
public T getSecond( ) {
return second;
}
@Override
return String .
format ( "(%s, %s)" , first, second
) ; }
}
public static void main
( String [ ] args
) { Pair<?> stringPair = new Pair<> ( "1" , "2" ) ;
Pair<?> intPair = new Pair<> ( 3 , 4 ) ;
// список, который может хранить в себе любые пары
List
< Pair
<?>> list1
= new ArrayList
<> ( Arrays .
asList ( stringPair, intPair
) ) ; // тут всё безопасно в отличие от raw типов, потому что читать
// из такой пары можно разве что в переменную типа Object, а
// записать в неё можно разве что null
Pair<?> pair = list1.get ( 0 ) ;
// всё в порядке, по сути то же самое
new ArrayList
< Pair
<?>> ( Collections .
singleton ( stringPair
) ) .
add ( intPair
) ; // ошибка времени компиляции, потому что из-за capture conversion
// был создан ArrayList<X>, в который нельзя засунуть intPair
new ArrayList
<> ( Collections .
singleton ( stringPair
) ) .
add ( intPair
) ; }
}
aW1wb3J0IGphdmEudXRpbC4qOwoKY2xhc3MgSWRlb25lIHsKCXByaXZhdGUgc3RhdGljIGNsYXNzIFBhaXI8VD4gewogICAgICAgIHByaXZhdGUgVCBmaXJzdDsKICAgICAgICBwcml2YXRlIFQgc2Vjb25kOwoKICAgICAgICBwdWJsaWMgUGFpcihUIGZpcnN0LCBUIHNlY29uZCkgewogICAgICAgICAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7CiAgICAgICAgICAgIHRoaXMuc2Vjb25kID0gc2Vjb25kOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQgc2V0Rmlyc3QoVCBmaXJzdCkgewogICAgICAgICAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBzZXRTZWNvbmQoVCBzZWNvbmQpIHsKICAgICAgICAgICAgdGhpcy5zZWNvbmQgPSBzZWNvbmQ7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgVCBnZXRGaXJzdCgpIHsKICAgICAgICAgICAgcmV0dXJuIGZpcnN0OwogICAgICAgIH0KCiAgICAgICAgcHVibGljIFQgZ2V0U2Vjb25kKCkgewogICAgICAgICAgICByZXR1cm4gc2Vjb25kOwogICAgICAgIH0KCiAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiglcywgJXMpIiwgZmlyc3QsIHNlY29uZCk7CiAgICAgICAgfQogICAgfQoJCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgewoJCVBhaXI8Pz4gc3RyaW5nUGFpciA9IG5ldyBQYWlyPD4oIjEiLCAiMiIpOwogICAgICAgIFBhaXI8Pz4gaW50UGFpciA9IG5ldyBQYWlyPD4oMywgNCk7CiAgICAgICAgCiAgICAgICAgLy8g0YHQv9C40YHQvtC6LCDQutC+0YLQvtGA0YvQuSDQvNC+0LbQtdGCINGF0YDQsNC90LjRgtGMINCyINGB0LXQsdC1INC70Y7QsdGL0LUg0L/QsNGA0YsKICAgICAgICBMaXN0PFBhaXI8Pz4+IGxpc3QxID0gbmV3IEFycmF5TGlzdDw+KEFycmF5cy5hc0xpc3Qoc3RyaW5nUGFpciwgaW50UGFpcikpOwogICAgICAgIC8vINGC0YPRgiDQstGB0ZEg0LHQtdC30L7Qv9Cw0YHQvdC+INCyINC+0YLQu9C40YfQuNC1INC+0YIgcmF3INGC0LjQv9C+0LIsINC/0L7RgtC+0LzRgyDRh9GC0L4g0YfQuNGC0LDRgtGMIAogICAgICAgIC8vINC40Lcg0YLQsNC60L7QuSDQv9Cw0YDRiyDQvNC+0LbQvdC+INGA0LDQt9Cy0LUg0YfRgtC+INCyINC/0LXRgNC10LzQtdC90L3Rg9GOINGC0LjQv9CwIE9iamVjdCwg0LAgCiAgICAgICAgLy8g0LfQsNC/0LjRgdCw0YLRjCDQsiDQvdC10ZEg0LzQvtC20L3QviDRgNCw0LfQstC1INGH0YLQviBudWxsCiAgICAgICAgUGFpcjw/PiBwYWlyID0gbGlzdDEuZ2V0KDApOwogICAgICAgIAogICAgICAgIC8vINCy0YHRkSDQsiDQv9C+0YDRj9C00LrQtSwg0L/QviDRgdGD0YLQuCDRgtC+INC20LUg0YHQsNC80L7QtQogICAgICAgIG5ldyBBcnJheUxpc3Q8UGFpcjw/Pj4oQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN0cmluZ1BhaXIpKS5hZGQoaW50UGFpcik7CiAgICAgICAgLy8g0L7RiNC40LHQutCwINCy0YDQtdC80LXQvdC4INC60L7QvNC/0LjQu9GP0YbQuNC4LCDQv9C+0YLQvtC80YMg0YfRgtC+INC40Lct0LfQsCBjYXB0dXJlIGNvbnZlcnNpb24KICAgICAgICAvLyDQsdGL0Lsg0YHQvtC30LTQsNC9IEFycmF5TGlzdDxYPiwg0LIg0LrQvtGC0L7RgNGL0Lkg0L3QtdC70YzQt9GPINC30LDRgdGD0L3Rg9GC0YwgaW50UGFpcgogICAgICAgIG5ldyBBcnJheUxpc3Q8PihDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3RyaW5nUGFpcikpLmFkZChpbnRQYWlyKTsKCX0KfQ==
compilation info
Main.java:50: error: incompatible types: Pair<CAP#1> cannot be converted to Pair<CAP#2>
new ArrayList<>(Collections.singleton(stringPair)).add(intPair);
^
where CAP#1,CAP#2 are fresh type-variables:
CAP#1 extends Object from capture of ?
CAP#2 extends Object from capture of ?
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
1 error
stdout