Спецификация языка Java: значение обозначения |S|

Я просматриваю JLS 7, чтобы понять приведение типов Раздел 5.5.1.

В нем говорится: Учитывая ссылочный тип времени компиляции S (исходный) и ссылочный тип времени компиляции T (цель), существует преобразование приведения из S в T, если не возникают ошибки времени компиляции из-за следующих правил. Если S является типом класса:

  • Если T — тип класса, то либо |S| ‹: |T| или |T| ‹: |S|. В противном случае возникает ошибка времени компиляции.

Они дали понять, являются ли S и T двумя типами в Раздел 4.10, затем

  • S :> T указывает, что S является супертипом T
  • S > T указывает, что S является правильным супертипом T, который подразумевает S :> T и S != T.

Я не могу найти значение |S|. Пожалуйста, помогите мне понять, что означает |S|? Означает ли это количество и типы свойств или что-то еще. Я попытался найти его в самом JLS, но не смог найти его значения. Заранее спасибо.


person Vaibhav Raj    schedule 15.06.2013    source источник
comment
Итак, я нашел: docs.oracle. com/javase/specs/jls/se7/html/jls-4.html#jls-4.6 Пишем |T| для стирания типа Т   -  person mrak    schedule 15.06.2013


Ответы (2)


Я не могу предоставить лучшее и менее формальное объяснение, чем документ для стирания типа. В вашем случае (приведение классов) «Если T является типом класса, то либо |S| ‹: |T|, либо |T| ‹: |S|. В противном случае возникает ошибка времени компиляции». означает, что после стирания типа приведение класса допустимо, если аргументы универсального типа находятся в «отношении класс-подкласс». Простой пример для этого:


    static class Bar {}
    static class FooBar extends Bar {}

    public static void main(String[] args) {

        List<FooBar> foobarList = (List<FooBar>) newList(Bar.class);
        List<Bar> barList = (List<Bar>) newList(FooBar.class);

        System.out.println("No cast class exception :)");
    }

    private static<T> List<?> newList(Class<T> clazz) {
        return new ArrayList<T>();
    }

person mrak    schedule 15.06.2013
comment
Спасибо за ответ. Я просто хотел понять теорию, которая работает за кулисами. - person Vaibhav Raj; 16.06.2013

4.6. Введите стирание

Пишем |Т| для стирания типа Т.

Следовательно, |S| — это стирание типа S.

person Daniel Le    schedule 22.07.2021