).Scala
trait Worker {def doSth: Unit}
class Base
object Base extends Worker
// this actually wouldn't work, just to show what I'm trying to achieve
def callSthStatic[T that companion object is <: Worker](implicit m: Manifest[T]) {
// here I want to call T.doSth (on T object)
m.getMagicallyCompanionObject.doSth
}
Herhangi bir fikir? Scala 2.9.x. kullanılıyorsa
trait Companion[T] {
type C
def apply() : C
}
object Companion {
implicit def companion[T](implicit comp : Companion[T]) = comp()
}
object TestCompanion {
trait Foo
object Foo {
def bar = "wibble"
// Per-companion boilerplate for access via implicit resolution
implicit def companion = new Companion[Foo] {
type C = Foo.type
def apply() = Foo
}
}
import Companion._
val fc = companion[Foo] // Type is Foo.type
val s = fc.bar // bar is accessible
}
Bu -Ydependent-method-types
bayrağıyla derlenmiş edilmelidir:
Gerçek Gist içeriğini ekledim - Gist kaybolabilir ve yalnızca bağlantı, yorum olarak nitelendirilir. –
I "hatası: yasadışı bağımlı yöntem tip örtülü def eşlik [T] (örtük bileşik: Tamamlayıcı [T]) = comp.apply()" alacağım satırında "örtülü def tamamlayıcı [T] (örtük bileşik: Tamamlayıcı [ T]) = comp() "scala ile 2.9.1. Yanlış mı yapıyorum? :-) –
Ben tipi 'Foo' sonra görülebilir eğer öyleyse bu oldukça şık görünüyor rağmen uygulamada kullanışlı olduğunu sanmıyorum bu yüzden, refakatçi nesneymiş olduğunu parantez ekleyeceğiz. –