fork download
  1. import java.util.*;
  2.  
  3. class Ideone {
  4. private static class Pair<T> {
  5. private T first;
  6. private T second;
  7.  
  8. public Pair(T first, T second) {
  9. this.first = first;
  10. this.second = second;
  11. }
  12.  
  13. public void setFirst(T first) {
  14. this.first = first;
  15. }
  16.  
  17. public void setSecond(T second) {
  18. this.second = second;
  19. }
  20.  
  21. public T getFirst() {
  22. return first;
  23. }
  24.  
  25. public T getSecond() {
  26. return second;
  27. }
  28.  
  29. @Override
  30. public String toString() {
  31. return String.format("(%s, %s)", first, second);
  32. }
  33. }
  34.  
  35. public static void main (String[] args) {
  36. Pair<?> stringPair = new Pair<>("1", "2");
  37. Pair<?> intPair = new Pair<>(3, 4);
  38.  
  39. // список, который может хранить в себе любые пары
  40. List<Pair<?>> list1 = new ArrayList<>(Arrays.asList(stringPair, intPair));
  41. // тут всё безопасно в отличие от raw типов, потому что читать
  42. // из такой пары можно разве что в переменную типа Object, а
  43. // записать в неё можно разве что null
  44. Pair<?> pair = list1.get(0);
  45.  
  46. // всё в порядке, по сути то же самое
  47. new ArrayList<Pair<?>>(Collections.singleton(stringPair)).add(intPair);
  48. // ошибка времени компиляции, потому что из-за capture conversion
  49. // был создан ArrayList<X>, в который нельзя засунуть intPair
  50. new ArrayList<>(Collections.singleton(stringPair)).add(intPair);
  51. }
  52. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
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
Standard output is empty