简单的问题,我有这样的代码:
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
}
任何人都可以告诉我如何解决这个问题或者更好地解决这个问题?
答案 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
。
鉴于没有可用的父类,您可能希望通过结构类型滚动自己的父类。类型类也可能是一个合适的类,但如果不知道你想要解决的实际问题,就不可能提出更好的建议。