2013-12-15 65 views
-1

是很普遍使用的抽象类全名的抽象类型的完整理解的名称:的类型泛型类

abstract class MyClass { 
    type MyType 
} 

我在想,是不是一个好的做法做了泛型类相同:

abstract class MyClass[MyType] { 

} 

我所看到的仅仅是这样的:

abstract class MyClass[T] { 

} 

如果我不得不使用一个通用类,并希望使用其参数的全名,是否符合Scala的名称约定:

abstract class MyClass[MyGenericType] { 

} 

+0

“它适合斯卡拉的名称转换”我想你的意思是“名称约定”。 – pedrofurla

回答

3

这样做没有任何问题。你不经常看到它的原因是通常参数不需要描述性名称。例如,List[T]是一个ListT项目。它是List[Item]并不真的添加任何东西。

另一方面,在scala库中有一些地方可以看到更多的描述性名称。就拿定义map,例如:

def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = { 

这里我们看到ReprThat都赐名是比标准的单字母更多。推测这是因为作者认为使用这些参数更清楚会是有益的,因为使用CanBuildFrommap的行为不是非常清楚(并且明确地不如仅知道TList中的项目)。

我经常使用它,当我认为它会使事情更清晰。例如,我可能有一个类Tagger[Word,Tag],因为我认为它比Tagger[A,B]或甚至Tagger[W,T]更容易阅读。

+0

如果存在类型边界(特别是结构类型边界),则倾向于看到更多描述性名称。 –

+0

另请注意[Scala样式指南](http://docs.scala-lang.org/style/naming-conventions.html#type_parameters_generics)文档。特别是使用以'A'开头的单个大写字母(不像Java中的'T') –