Как тип может иметь несколько супертипов, которые являются типами массива, а сам не может быть типом массива?

Я пытаюсь закодировать реализацию вывода типов, используя алгоритм, описанный в спецификации Java, по адресу https://docs.oracle.com/javase/specs/jls/se8/html/jls-18..html#jls-18.2.3

Здесь есть строка с некоторыми последствиями, которые я изо всех сил пытаюсь понять:

«... среди супертипов S, которые являются типами массивов, идентифицируется наиболее конкретный тип, S'[] (это может быть сам S)».

Как может сам S не быть наиболее конкретным типом массива? Другими словами, как тип может иметь супертипы, которые являются типами-массивами, а сам не является типом-массивом (и, следовательно, наиболее специфичным типом)?

Я пропустил что-то очевидное здесь?

Спасибо за любое понимание, которое может предложить...


person Elias Vasylenko    schedule 13.12.2014    source источник
comment
Ваш заголовок не совсем точно отражает ваш фактический вопрос.   -  person user207421    schedule 14.12.2014
comment
Вопрос заголовка эквивалентен описанию. Я повторяю заглавный вопрос почти дословно в описании...   -  person Elias Vasylenko    schedule 14.12.2014
comment
Вы неправильно поняли процитированный вами отрывок. Он ничего не говорит о том, что S не является типом массива. Это просто означает, что S не может быть «самым конкретным» типом.   -  person user207421    schedule 14.12.2014
comment
Но если S является типом массива, то из этого непосредственно следует, что это наиболее конкретный тип массива этого типа и всех его супертипов. У него не может быть супертипа, который был бы более конкретным, чем он, что буквально не может произойти по определению...   -  person Elias Vasylenko    schedule 14.12.2014
comment
Кроме того, вопрос был решен. S может быть подстановочным знаком или, возможно, типом пересечения.   -  person Elias Vasylenko    schedule 14.12.2014


Ответы (1)


Скажем, у вас есть Double[] и параметры — Number[] или Object[], тогда Number[] является наиболее точным совпадением. При выполнении вывода типа может быть несколько ограничений. Он может даже вывести тип (Serializable[] & Comparable[])

person Peter Lawrey    schedule 13.12.2014
comment
Да, теперь я задал вопрос - и благодаря также теперь удаленному комментарию к вопросу - я понял, что есть несколько способов, которыми мы можем иметь такие вещи, как типы подстановочных знаков с верхними границами для типов массивов и типы пересечения, включающие типы массивов и т. д. Ну, я еще немного подумаю об этом, а затем, вероятно, просто отмечу это как принятое. - person Elias Vasylenko; 14.12.2014
comment
Я удалил свой комментарий, потому что я так не думаю? extends CharSequence[] на самом деле является типом. Хотя я не совсем уверен, что это такое. Я много раз пытался и не смог понять дженерики и типы Java, но они совершенно непонятны. - person Paul Boddington; 14.12.2014
comment
Нет, вы были совершенно правы, по крайней мере, в контексте вопроса. Экспериментируя с этим, я только что обнаружил несколько ошибок в реализации вывода типов Eclipse, ха-ха, что одновременно заставляет меня чувствовать себя лучше из-за моего глупого вопроса и пугает меня. Ваше здоровье. - person Elias Vasylenko; 14.12.2014
comment
В маловероятном случае, если кому-то еще понадобится ответ на этот вопрос, хотя это явно не указано в спецификации, я думаю, что алгоритм таков, что S не может быть подстановочным типом в этом контексте, хотя он может быть типа пересечения. Подстановочные знаки должны обрабатываться ограничениями включения, а не встречаться ограничениями подтипа. - person Elias Vasylenko; 14.12.2014