Я пишу класс Scala, который расширяет класс Java. Я должен расширить этот абстрактный Java-класс, потому что он содержит некоторые конвертеры, и мне нужно написать собственный конвертер, который я могу подключить к своей структуре. Таким образом, подпись метода ниже навязывается мне: она генерируется автоматически Eclipse, когда я говорю, что мой класс расширяет их абстрактный класс. Если я попытаюсь изменить подпись метода, класс не скомпилируется, потому что «он не реализует абстрактный метод от родителя».абстрактный тип T не отмечен, так как он устранен стиранием
Реализация метода - это мой выбор, конечно, но я считаю, что я не могу удовлетворить ограничения системы типов.
Мне нужно сделать что-то очень просто: обработать «None» как null и вернуть что-нибудь еще, как есть. Но я считаю, что я не могу сделать это безопасным способом. Если я напишу код, как показано ниже, я получаю предупреждение о том, что «абстрактный тип T не отмечен, поскольку он устраняется стиранием». Как я могу это устранить?
Я также задаюсь вопросом, как мой код будет выглядеть после стирания, если применить к нему, т. Е. Что будет выглядеть второе условие «если».
Интуитивно я понимаю, что я не могу гарантировать возвращение T, когда входной сигнал Any - вот почему компилятор недоволен. На практике это будет работать, потому что мы просто читаем строки и возвращаем строки, но подпись метода навязывается мне декларацией наследования.
def execute[T](value: Any): T = {
if (value == null || value == "None") null.asInstanceOf[T]
// Warning: abstract type T is unchecked since it is eliminated by erasure
else if (value.isInstanceOf[T]) value.asInstanceOf[T]
// warning here:^
else null.asInstanceOf[T]
}
Как реализовать этот метод?
Возможно, это может помочь: [http://stackoverflow.com/questions/1094173](http://stackoverflow.com/questions/1094173). – paulotorrens
Поскольку стирание превращает второй оператор «if» в «isInstanceOf [Object]», что всегда верно, на самом деле это гарантировано, что он не выполняет то, что планировал программист. Я шокирован, что это предупреждение, а не ошибка. Я понимаю, что эта проблема не может быть решена безопасным типом, потому что вход - это Any, а выход - T. То, что я понимаю из решения Alexey, состоит в том, что, как только вы начинаете делать такие вещи, вы в основном говорите компилятору «доверяете» я, во время выполнения, это будет зависеть от T ", а« гарантия безопасности типа компилятора »станет« Я вижу, что программист пообещал T ». – radumanolescu