2013-03-21 62 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