Написание метода для возврата Java-класса, ограниченного определенным типом в Scala - PullRequest
1 голос
/ 27 июля 2011

Например, у меня есть это:

abstract class Vehicle

class Car extends Vehicle

И я хочу написать метод, который возвращает Java-класс, но ограничен только классами типа Vehicle.

object CarDealer {
  def getVehicularClass: Class[Vehicle] = classOf[Car]
}

Я не могу использовать следующие разные подходы к работе:

  1. То, как я обычно поступил бы с этим

    object CarDealer {
      def getVehicularClass[A <: Vehicle]: Class[A] = classOf[Car]
    }
    
    [error]  found   : java.lang.Class[Car](classOf[Car])
    [error]  required: Class[A]
    [error]   def getVehicularClass[A <: Vehicle]: Class[A] = classOf[Car]
    
  2. Использование абстрактного типа

    type V <: Vehicle
    
  3. Использование неявного манифеста (кажется, что он ограничивает только аргументы метода, а не возвращаемые значения)

Может кто-нибудь помочь?

Спасибо!

Ответы [ 3 ]

1 голос
/ 27 июля 2011

Vehicle - это супертип.Вы не знаете, что какой-то подтип A из Vehicle будет включать Car, поэтому вы не можете написать его таким образом.Что если кто-то попросит Bus?CarDealer не может помочь, но подпись типа обещает, что она может заставить его работать на любой A <: Vehicle, который вы просите.

Если вы не заботитесь о сохраненииреальный тип транспортного средства, просто напишите

object CarDealer {
  def getVehicularClass: Class[Vehicle] = classOf[Car]
}

В качестве альтернативы, если вы хотите, чтобы какой-то интерфейс подчинялся, вы указываете в интерфейсе, что вы хотите:

trait VehicleClass[A <: Vehicle] {
  def getVehicularClass: Class[A]
}

и тогда у вассостояние объекта, какой подкласс транспортного средства он обещает вернуть:

object CarDealer extends VehicleClass[Car] {
  def getVehicularClass = classOf[Car]
}

, и теперь все обещания определены и соответствуют.

0 голосов
/ 28 июля 2011

Это ограничение адекватно выражено с помощью экзистенциальных типов:

object CarDealer {
  def getVehicularClass: Class[_ <: Vehicle] = classOf[Car]
}

Конечно, могут быть и другие требования, которые делают экзистенциальный тип неуместным, но ваша проблема не особенно хорошо сформулирована.

0 голосов
/ 27 июля 2011

Тип Class[T] инвариантен в типе T. Таким образом, даже если A extends B, classOf[A] не является подтипом classOf[B]. Поэтому нет точного решения вашей проблемы ...

...