【问题标题】:Writing a method to return a java Class constrained to a certain type in Scala在Scala中编写一个方法来返回一个限制为某种类型的java类
【发布时间】:2011-07-26 22:34:34
【问题描述】:

例如,我有这个:

abstract class Vehicle

class Car extends Vehicle

我想编写一个返回 java 类的方法,但仅限于车辆类型的类。

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. 使用隐式清单(似乎只限制方法参数而不限制返回值)

谁能帮忙?

谢谢!

【问题讨论】:

    标签: scala types parameterized


    【解决方案1】:

    Vehicle 是超类型。你不知道Vehicle 的某些子类型A 将包含Car,所以你不能这样写。如果有人要求Bus 怎么办? CarDealer 无能为力,但类型签名承诺它可以使其适用于您要求的任何 A &lt;: 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]
    }
    

    现在所有的承诺都被指定并兑现了。

    【讨论】:

    • 你的第一个解决方案没有编译...第二部分还可以。
    【解决方案2】:

    Class[T] 类型在T 类型中是不变的。因此即使A extends BclassOf[A] 不是classOf[B] 的子类型。因此,您的问题没有确切的解决方案...

    【讨论】:

      【解决方案3】:

      这个约束用存在类型充分表达:

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

      当然,可能还有其他要求使存在类型不合适,但您的问题并没有特别清楚地说明。

      【讨论】:

        猜你喜欢
        • 2012-11-28
        • 2014-06-22
        • 1970-01-01
        • 2018-11-27
        • 2020-08-15
        • 2013-02-23
        • 1970-01-01
        • 1970-01-01
        • 2020-04-02
        相关资源
        最近更新 更多