2011-03-20 29 views
2

簡單的問題,我有這樣的代碼:值的對象

class Context[A] { 
    def t: A 
} 

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

SomeObjectobject保存價值和功能,我想在我的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

您正在混合具有值的類型。'Context'需要一個類型參數,'SomeObject'是一個值,一個對象而不是一個類型。 「Context」是什麼意思你的類型'A'? 'SomeObject'從哪裏來?我需要更多信息來回答。 – 2011-03-20 17:54:17

+0

@Peter Schmitz:編輯,希望現在更清楚。 – Lanbo 2011-03-20 22:50:39

+0

「據我所知,scala中的一個對象是一個單例類,所以它將是一個類型,是的,但也是一個值,它是它自己類型的唯一值。」你正在考慮我想的'案例對象'。 – 2011-03-21 06:22:32

回答

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

第一SomeObject是一種類型,類型參數爲背景,但在第二行中使用它,就好像它是一個變量。

思考的

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

int是一個類型,而不是一個變量,因此x不能返回Int,它只能返回整數。

+0

我意識到這一點,但這裏的'SomeObject'不僅僅是一個類型,它是一個'object',因此是singleton類。一個階級和它自己唯一的價值。我如何參考? – Lanbo 2011-03-20 22:51:38

+0

@Scán你不能。類型與其伴侶對象之間沒有關聯。此外,'Context'不是'Context [A]'類型的對象。除了它自己的singleton類型,它只是一個'AnyRef'。 – 2011-03-20 23:39:42

+0

它更像'...列表[42] {def x = 42 ...' – 2011-03-21 00:40:03

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 

如果函數不是一致的類型,那麼函數類型本身可以被參數化。例如。

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 

使用這種方法隱式可以從對象或實例中解除。沒關係。

+0

這也是我的想法,但是oejct有大約50個函數,甚至更多的常量......感謝輸入,採取了不同的方法。 – Lanbo 2011-03-21 12:14:08

0

您的非代碼說明已經聲明Context的類型參數A將爲AnyRef,因此使其無效。 Context基本上是:

class Context { def t: AnyRef } 

你肯定不能在這方面的一些實例調用context.t.baz

鑑於沒有有用的父類可用,您可能需要通過結構類型推出自己的父類。類型類也可能非常適合,但如果不知道您正在嘗試解決的實際問題,則無法更好地提供建議。