Как обосновать, почему непроверенное приведение в порядке, относительно Copyable getObjectCopy()

(Это продолжение моего предыдущего вопроса.)

У меня интерфейс называется Copyable, который имеет одну функцию

Copyable getObjectCopy();

Это используется многими другими классами. Потому что эта функция всегда возвращает Copyable, это приводит к непроверенным броскам. Пример:

@SuppressWarnings("unchecked")  //Copy of itself is the same type.
ValidateValue<L> vvo = (ValidateValue<O>)this_toCopy.getValidator().getObjectCopy();
vvBlkA = vvo;

Мой вопрос относится к рекомендации Джоша Блоха (в Effective Java, 2nd ed., Item 24):

Каждый раз, когда вы используете аннотацию @SuppressWarnings("unchecked"), добавляйте комментарий, объясняющий, почему это безопасно.

Его пример

// This cast is correct because the array we're creating
// is of the same type as the one passed in, which is T[].
@SuppressWarnings("unchecked")
T[] result = (T[]) Arrays.copyOf(elements, size, a.getClass());
return  result;

(см. внизу страницы 9/117: http://www.infoq.com/resource/articles/bloch-effective-java-2e/en/resources/Bloch_Ch05.pdf)

Мне нравится эта идея, и я хочу с ней getObjectCopy()

@SuppressWarnings("unchecked")  //Copy of itself is the same type.
ValidateValue<L> vvo = (ValidateValue<O>)this_toCopy.getValidator().getObjectCopy();
vvBlkA = vvo;

Мой комментарий кажется неубедительным, но я не могу придумать ничего лучшего. И вот мой вопрос: почему этот необузданный актерский состав оправдан? Какой значимый комментарий действительно поможет будущим разработчикам, что означает нечто большее, чем просто "просто доверься мне"?

1 ответ

Решение

Мы в мире Java 5+ сейчас! Обобщения пользователя.

Вы можете изменить подпись Copyable что-то вроде:

interface Copyable<T extends Copyable> {
    T getObjectCopy();
}

Теперь ваш ValidateValue<L> значение будет что-то вроде:

puvlic class ValidateValue<L> implements Copyable<ValidateValue<L>> {
    ...
}

и все (включая компилятор) будут счастливы!

Другие вопросы по тегам