ПСБ упоминает в алгоритме вывода типов (§15.12.2):Когда вывод типа Java создает бесконечный тип?
Вполне возможно, что упомянутый выше процесс дает бесконечный тип. Это допустимо, , а компиляторы Java должны распознавать такие ситуации и представлять их соответствующим образом с использованием циклических структур данных.
Однако я не могу найти фактический пример, где javac производит бесконечный тип. Я думаю, что он должен производить один в следующих случаях:
<T> T pick(T a, T b) { ... }
pick("string", 3);
Обе строки и Integer является Сопоставимыми < themselve>, так что их общий супертип должен быть Comparable<? extends Comparable<? extends Comparable<? ...>>>
(бесконечность).
я могу сделать:
Comparable<? extends Comparable<?>> x = pick("string", 3);
но потом я попробовал:
Comparable<? extends Comparable<? extends Comparable<?>>> x = pick("string", 3);
и это не компилируется. Кажется, что рекурсия прерывается после двух шагов.
Вы знаете какой-либо случай, чтобы заставить Java фактически создавать бесконечный тип?
-
Edit: мне кажется, что выше ошибка компилятора. Чтение спецификации, давайте посмотрим, как расчет lub(String, Integer)
работает:
ST(String) = { String, Comparable<String>, Serializable, CharSequence, Object }
ST(Integer) = { Integer, Comparable<Integer>, Serializable, Number, Object }
EC = { Comparable, Serializable, Object }
MEC = { Comparable, Serializable }
Inv(Comparable) = { Comparable<String>, Comparable<Integer> }
lcta(String, Integer) = ? extends lub(String, Integer)
lci(Inv(Comparable)) = Comparable<? extends lub(String, Integer)>
lub(String, Integer) = Serializable & Comparable<? extends lub(String, Integer)>
Так lub(String, Integer)
должен быть бесконечным типом. Кажется, Джавак здесь не прав. Может быть, он не реализует бесконечные типы в конце концов?
Имейте в виду последнюю часть вашей цитаты: «... Java-компиляторы должны распознавать такие ситуации и представлять их соответствующим образом ...». Любой компилятор, который соответствует спецификациям, даже не будет мигать, если вы передадите ему «бесконечный тип». Добавьте стирание стилей в микс, и все в вашем примере просто превратится в Comparable или Object. Поэтому, если вы не строите компилятор Java, вы, вероятно, даже не заметите. – cHao
@cHao: Похоже, что javac от Sun не соответствует спецификации. Я не смог создать с ним бесконечный тип, поэтому я задаю этот вопрос. Похоже, они просто оставили эту языковую функцию нереализованной. – Daniel