2013-03-21 60 views
1

界是否有可能寫出這樣的事情和重用HelperTest.AnyHelper類型?重用斯卡拉類型的方法定義

class HelperUtil 
{  
/* this is what I would like to write... reuse the AnyHelper type in the definition */ 
    def accept[HelperTest.AnyHelper](helper : HelperTest.AnyHelper) = 
    { 
     // code here 
    } 
} 

object HelperTest 
{ 
    type AnyHelper = T forSome { type T <: GenericHelper } 
} 

abstract class GenericHelper 
{ 
    val name = "" 
} 

目前,我不得不寫這篇文章,因爲編譯器不會讓我:

class HelperUtil 
{ 
/* gets too verbose, if the generic type gets more complex and would be useful to reuse the type */ 
    def accept[T <: GenericHelper](helper : T) = 
    { 
     // code here 
    } 
} 

abstract class GenericHelper 
{ 
    val name = "" 
} 

還是我完全錯誤的軌道上?

回答

0

我想你是誤會了類型的簽名如何參數,如def accept[T]工作。該類型在此簽名變量T約束,就是T被引入作爲新類型的變量。如果在當前上下文中已經存在一個具有相同名稱的類型變量,則它將被新綁定的T遮蔽。考慮下面的例子:

class Foo[T] { 
    def id[T](t: T) = t 
} 

類簽名綁定一個新T,可以在類體內被參考。但是,方法簽名也會綁定T,這會影響類T。其結果,就可以實例化類T某種類型X,並與一些其他類型的Y方法T

val f = new Foo[String] 
f.id(0) 

返回到您的代碼。簽名

def accept[HelperTest.AnyHelper](helper : HelperTest.AnyHelper) 

從而試圖綁定一個新的變量類型HelperTest.AnyHelper - ,編譯器拒絕,因爲類型變量可以不包含一個點(.)。

請不要使用以下:

import scala.language.existentials 

trait A 
class B1 extends A 
class C1 extends B1 
class B2 extends A 

object HelperUtil { 
    type MyA = T forSome { type T <: A } 
} 

class HelperUtil { 
    /* Reuse type declaration */ 
    def foo(a: HelperUtil.MyA) = println(a.getClass.getName) 
    def bar(a: HelperUtil.MyA) = println(a.getClass.getName) 
    def baz(a: HelperUtil.MyA) = println(a.getClass.getName) 
} 

val hu = new HelperUtil 

/* Instantiate with different types */ 
hu.foo(new B1) // B1 
hu.foo(new B2) // B2 
hu.bar(new C1) // C1 
+0

我所尋找的是「再利用」的類型泛型參數的方式,因爲準確的參數用於幾個地方。有沒有辦法,還是有其他的實施建議? – slaursen 2013-03-21 16:41:45

+0

@slaursen我很抱歉,但我不明白「重複使用」是什麼意思。你已經通過聲明'helper'來重用類型'HelperTest.AnyHelper'。 – 2013-03-21 16:46:51

+0

反覆重複「[A <:某物[A]]」的示例。如果界限更加複雜,那將是地獄和錯誤傾向於不斷重複它。 def method1 [A <:Something [A]](parm:A)= {...} def method2 [A <:Something [A]](text:String,parm:A )= {...} def method3 [A <:Something [A]](parm:A):List [A] = {...} etc }' – slaursen 2013-03-21 18:03:11