Несоответствие типа Scala между родительским и дочерним объектами (класс класса, определенный Java, инвариантен в типе T)

#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 вместо a Class где-нибудь в «etc.»).

Ответ №1:

Можете ли вы попытаться изменить возвращаемый тип метода? Я просто изменил VehicleType на Vehicle в типе возвращаемого метода и работал со мной.

Комментарии:

1. Извините @user3816201 — это была ошибка копирования и вставки для моего родителя. Пожалуйста, посмотрите мои правки, мой код все- таки возвращает Vehicle (не VehicleType ) и все еще жалуется на сообщение компилятора, указанное выше.

2. я просто скопировал и вставил. это уже работает на меня. Какую версию scala вы используете?