默认通用值

Nik*_*kov 6 generics scala

说我有一节课:

class SomeClass[+A <: AnyRef, +B <: Any]
Run Code Online (Sandbox Code Playgroud)

要指定它,我总是必须指定通用参数的类型.即,将其最通用的版本指定为我必须执行的方法参数类型def someMethod(param1: SomeClass[AnyRef, Any])new SomeClass[AnyRef, Any]实例化它.当涉及具有复杂泛型的更复杂类型时,它成为一个主要的痛苦.

[AnyRef, Any]当我不提供通用信息时,有没有办法使部分隐含?比如def someMethod(param1: SomeClass)

有没有办法_可以帮助我解决这个问题以及如何解决?

PS我为最初没有明确陈述问题而道歉.

huy*_*hjl 7

正如我的评论中所建议的,做这样的事情可以节省一些打字并且非常简单:

type SomeClassAny = SomeClass[AnyRef, Any]
Run Code Online (Sandbox Code Playgroud)


Des*_*tin 5

如果你真的不关心这个东西会有什么类型,你可以用[_,_]进行参数化.例子可能是这样的

val thing = new SomeClass[_, _]()
Run Code Online (Sandbox Code Playgroud)

要么

def thingDoer(sc: SomeClass[_, _]) { /* Stuff */ }
Run Code Online (Sandbox Code Playgroud)

为了更清楚它的本质,下划线被称为"存在类型",它基本上相当于Java中的原始类型,它也可以起到类似于Java中的通配符类型的作用.例如,这个精神分裂的Java代码

public void thingThatTakesAMapList(List<? extends Map> mapList) { /* Whatever */ }
Run Code Online (Sandbox Code Playgroud)

与此Scala代码相同

def thingThatTakesAMapList(mapList: List[_ <: Map[_, _]]) { /* Some incredibly wild subroutine */ }
Run Code Online (Sandbox Code Playgroud)

另外,值得注意的是List [Any]和List [_]之间的区别是......非常微妙.也就是说前者是Any的列表,而后者是[我不知道/关心]的列表._ 从任意完全不同,虽然.例如,如果您有一个具有此签名的类

class SillyClass[T <: Map[_, _]]
Run Code Online (Sandbox Code Playgroud)

这样做是没有效果的

val thing = new SillyClass[Any]()
Run Code Online (Sandbox Code Playgroud)

虽然它可能对你有效

val thing = new SillyClass[HashMap[_, _]]()
Run Code Online (Sandbox Code Playgroud)

并且,如果函数将SillyClass作为参数,您可以编写

def sillyClassTaker(sc: SillyClass[_])
Run Code Online (Sandbox Code Playgroud)

并确保sc 不会被类型Any参数化; 它是在Map [_,_]的一些未知子类上进行参数化的.也就是说下划线是一个占位符,但它仍然需要在其位置存在有效的类型参数.所以,虽然这一切都很酷,而且......我并不特别推荐使用它太多了.如果你需要做一些事情......通配符,或者根本不关心类型参数,那么它是一个很好的选择.