2015-07-17 2 views
8

enter image description hereEclipse сообщает, что метод clone() массива относится к соответствующему типу (включая примитивы)?

Я был в предположении, что, когда затмение предлагает методы, то в форме

<methodName>(<any parameters>) : <retunType> - <actual class the method will be invoked from> 

И это, кажется, верно для всех методов (но клон()) в публикуемой картине также ,

Но для clone(), eclipse говорит, что метод исходит из типа массива (byte в этом случае).

Это то же самое для всех массивов примитивных типов и массивов ссылочных типов а.

Например: Для String[] это дает clone() : String[] - String

Что это значит? Я понимаю, что неправильно? Или есть что-то еще в методе clone()?

Для того, чтобы все было ясно, мой вопрос: Почему eclipse говорит, что «clone()» - это байт, когда он должен быть от байта [] точно так же, как «длина».

ответ

3

На это может быть дан ответ, если посмотреть на исходный код eclipse.

Ответ на ваш вопрос прост и неутешителен: код пользовательского интерфейса Eclipse, который производит полные предложения, создает неисправный дисплей. Обратите внимание, что полное предложение для свойства length массива показывает правильный тип (байт [] в вашем примере).

Деталь:

Когда вы вызываете помощник завершения возможных заканчивании рассчитываются как CompletionProposals.

Свойство CompletionProposals, которое используется для отображения типа предлагаемого метода или заполнения поля, является объявлением типа TypeSignature (см. Ниже).

CompletionTests показывает, что объекты предложения для метода clone и длина поля байтового массива будут иметь декларациюTypeSignature "[B".

Теперь CompletionProposalLabelProvider принимает эти объекты предложения и строит представление в виде StyledString. Метод #createLabelWithTypeAndDeclaration делает это для предложений на местах, метод #createMethodProposalLabel для предложений по методам. Они имеют разные реализации для отображения типа объявления.

Метод отображает вызовы SignatureUtil.stripSignatureToFQN, передавая «[B» как подпись. Полученный результат лишился всей информации о массиве и просто «байт».

Полевой дисплей вызывает Signature.getSignatureSimpleName, проходящий «[B». Этот метод не игнорирует информацию о массиве и возвращает «byte []».

+0

Очень подробно ... Спасибо ... – Codebender

+1

Основываясь на приведенном выше анализе (большое спасибо!), Эта ошибка исправлена, см. Https://bugs.eclipse.org/473101 –

-1

Это потому, что клонирование зависит от типа объекта. Это зависит от размера памяти объектов или примитивных типов данных.

Метод clone() на самом деле является методом суперкласса «Объект». Другие классы должны переопределить это и реализовать свою собственную реализацию для безопасного клонирования. Если ничего не предусмотрено, вызывается и реализуется нормальное клонирование класса Object.

Именно поэтому клонирование массива зависит от типа данных, которые хранятся в массиве, и будет вызываться метод клонирования этого типа данных. Если у вас есть int [], вызывается clone for int. если у вас есть класс A, а «a» - объект класса A, и у вас есть массив объектов «a» (a []), будет вызван клон из класса A.

Надеюсь, что ответит на ваш вопрос.

+0

Потому что и массив можно рассматривать как коллекцию любого типа объекта/данных. Если вы выберете int array, класс массива не сможет узнать, сколько пространства занимает int. Если вы выберете Object array, класс массива не сможет узнать, сколько места занимает объект. Таким образом, это отбрасывает эту ответственность перед классом, из которого состоит массив. Вот почему clone() поступает из типа данных, а не из класса массива. Надеюсь это поможет. –

+0

Клонирование массива не клонирует содержащиеся в нем элементы, клон из класса A не будет вызываться для 'A []'. –