Почему универсальное приведение List до List успешно на Sun JDK 6, но не компилируется на Oracle JDK 7?

Следующий код

class GenericCompilationFailureDemo {
    List<? extends GenericCompilationFailureDemo> newList() { 
        return new ArrayList<GenericCompilationFailureDemo>(); 
    };

    void useList() {
        List<GenericCompilationFailureDemo> list = 
            (List<GenericCompilationFailureDemo>) newList();
    }  

    List<? extends Set<GenericCompilationFailureDemo>> newListOfSpecificSets() { 
        return new ArrayList<Set<GenericCompilationFailureDemo>>(); 
    };

    void useListOfSpecificSets() {
        List<Set<GenericCompilationFailureDemo>> listOfSpecificSets = 
            (List<Set<GenericCompilationFailureDemo>>) newListOfSpecificSets();
    } 

    List<? extends Set<? extends GenericCompilationFailureDemo>> newListOfSets() { 
        return new ArrayList<Set<? extends GenericCompilationFailureDemo>>(); 
    };

    void useListOfSet() {
        List<Set<? extends GenericCompilationFailureDemo>> listOfSets = 
            (List<Set<? extends GenericCompilationFailureDemo>>) newListOfSets();
    }  
}

компилируется под Sun JDK 1.6.0_20 (64-разрядная версия в Windows Vista, но я не думаю, что это имеет какое-либо значение), но вызывает следующий сбой компиляции под Oracle JDK 1.7.0_01 (та же платформа):

[ERROR] src\main\java\GenericCompilationFailureDemo.java:[56,78] error: inconvertible types

Обратите внимание, что первые два приведения типа extends-to-specific-type в useList и useListOfSpecificSets по-прежнему успешны в версиях 1.7. .0_01, поэтому может показаться, что это как-то связано с «двойным универсальным расширением».

Есть идеи, что могло измениться между 6 и 7, и соответствует ли наблюдаемое поведение спецификации или ошибке?

отредактировано в ответ на комментарий Санджая:

@Sanjay: Ага, интересно! Вот результат выполнения java -version :

java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)

И вот результат javac GenericCompilationFailureDemo.java (тот же код, что и выше, с операторами импорта для List, ArrayList и Set):

GenericCompilationFailureDemo.java:30: error: inconvertible types
            (List<Set<? extends GenericCompilationFailureDemo>>) newListOfSets()
;
                                                                              ^
  required: List<Set<? extends GenericCompilationFailureDemo>>
  found:    List<CAP#1>
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Set<? extends GenericCompilationFailureDemo> from capture of ?
 extends Set<? extends GenericCompilationFailureDemo>
Note: GenericCompilationFailureDemo.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error
13
задан ROMANIA_engineer 23 June 2017 в 15:22
поделиться