对象的价值

时间:2011-03-20 17:40:27

标签: scala

简单的问题,我有这样的代码:

class Context[A] {
    def t: A
}

object Context {
    implicit object StandardContext extends Context[SomeObject] {
        def t = SomeObject
    }
}

SomeObject是一个object,其中包含我要在Context中访问的值和函数。不幸的是,我想要包含的A的不同类型没有java.lang.Object以外的公共父类。

SomeObject的定义如下:

final object SomeObject {
    def func1 = ...
    def func2 = ...
}

在一些不是我的代码中。但是当我尝试上面的内容时,Scala编译器会抱怨SomeObject is not a value。据我所知,scala中的object是一个单例类,所以它是一个类型,是的,但也是一个值,它是自己类型的唯一值。

我想做的是这样的事情:

class Foo[A](bar: Int)(implicit context: Context[A]) {
    def baz = context.t.baz
}

任何人都可以告诉我如何解决这个问题或者更好地解决这个问题?

3 个答案:

答案 0 :(得分:3)

implicit object StandardContext extends Context[SomeObject] {
    def t = SomeObject

第一个SomeObject是一个类型,是Context的一个类型参数,但在第二行中它被用作一个变量。

想想

 ... List [Int] {
     def x = Int // fail

Int是一种类型,而不是变量,因此x无法返回Int,它只能返回一个整数。

答案 1 :(得分:0)

  

任何人......有更好的解决方法吗?

如何从对象中提升所需函数并将其用作隐式函数?

scala> object SomeObject {
     |  def baz = "hi"
     | }
defined module SomeObject

scala> implicit val baz = SomeObject.baz _
baz: () => java.lang.String = <function0>

scala> class Foo(bar: Int)(implicit baz: () => String) {
     |   def bazme = baz()
     | }
defined class Foo

scala> new Foo(100).bazme
res2: String = hi

如果函数不是一致类型,则可以参数化函数类型本身。 E.G。

class Foo[A](bar: Int)(implicit baz: () => A) // or
class Foo[A](bar: Int)(implicit baz: A) // or
class Foo[A, B](bar: Int)(implicit baz: A => B) // etc

使用这种方法可以从Object或实例中提取隐式。没关系。

答案 2 :(得分:0)

您的非代码说明已断言A的类型参数Context将为AnyRef,因此无效。 Context基本上是:

class Context { def t: AnyRef }

你肯定无法在某个实例上调用context.t.baz

鉴于没有可用的父类,您可能希望通过结构类型滚动自己的父类。类型类也可能是一个合适的类,但如果不知道你想要解决的实际问题,就不可能提出更好的建议。