#scala #inheritance #reflection #introspection
#scala #наследование #отражение #самоанализ
Вопрос:
У меня есть иерархия объектов (Scala) следующим образом:
class Vehicle {
...
}
class Car extends Vehicle {
...
}
class Motorcycle extends Vehicle {
...
}
и т.д. У меня есть метод, который принимает некоторые входные данные и возвращает тип класса Vehicle
подкласса, который «лучше всего подходит для него»:
def chooseVehicleType(fizz : String) : Class[_ <: Vehicle] = {
fizz match {
case "buzz" => classOf[Car]
case "foo" => classOf[Motorcycle]
// etc.
case _ => throw new UnsupportedOperationException(s"We don't support ${fizz} yet.")
}
}
Проблема здесь в том, что я получаю ошибки компилятора при classOf
присваивании:
несоответствие типа; найдено : Classcom.me.myapp.model.Требуется машина: класс[com.me.myapp.model.Транспортное средство] Примечание: com.me.myapp.model.Car <: com.me.myapp.model.Транспортное средство, но класс класса, определенный Java, инвариантен в типе T. Возможно, вы захотите изучить подстановочный знак, такой как _ <: com.me.myapp.model .Транспортное средство. (SLS 3.2.10)
Есть идеи относительно того, что здесь происходит, и каково исправление?
Комментарии:
1. Нет, с помощью этого кода вы не можете получить эту ошибку (если только вы не возвращаете a
Car
вместо aClass
где-нибудь в «etc.»).
Ответ №1:
Можете ли вы попытаться изменить возвращаемый тип метода? Я просто изменил VehicleType на Vehicle в типе возвращаемого метода и работал со мной.
Комментарии:
1. Извините @user3816201 — это была ошибка копирования и вставки для моего родителя. Пожалуйста, посмотрите мои правки, мой код все- таки возвращает
Vehicle
(неVehicleType
) и все еще жалуется на сообщение компилятора, указанное выше.2. я просто скопировал и вставил. это уже работает на меня. Какую версию scala вы используете?