说我有一节课:
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我为最初没有明确陈述问题而道歉.
正如我的评论中所建议的,做这样的事情可以节省一些打字并且非常简单:
type SomeClassAny = SomeClass[AnyRef, Any]
Run Code Online (Sandbox Code Playgroud)
如果你真的不关心这个东西会有什么类型,你可以用[_,_]进行参数化.例子可能是这样的
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 [_,_]的一些未知子类上进行参数化的.也就是说下划线是一个占位符,但它仍然需要在其位置存在有效的类型参数.所以,虽然这一切都很酷,而且......我并不特别推荐使用它太多了.如果你需要做一些事情......通配符,或者根本不关心类型参数,那么它是一个很好的选择.
| 归档时间: |
|
| 查看次数: |
735 次 |
| 最近记录: |