使用类型参数时在 Scala 中重载 [英] Overloading in Scala when type parameters are being used

查看:57
本文介绍了使用类型参数时在 Scala 中重载的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

看看我目前正在处理的这段代码(它的目的是从 main 方法的参数中解析一些参数):

Look at this piece of code I am working on at the moment (It's meant to parse some arguments from the arguments of the main method):

def parser[T](identifier: String, default: T, modifier: String => T): T = {
  val l = args.filter(_.startsWith(identifier))
  if(l.isEmpty) default
  else modifier(l(0).drop(identifier.length).trim)
}

我还打算编写一个处理字符串情况的重载方法:

I also intended to write an overloaded method that deals with the case of Strings:

def parser(identifier: String, default: String): String = parser[String](identifier, default, identity)

编译器似乎对此没有印象,并且不允许我重载该方法.我必须更改其中一种方法的名称才能使其工作:

The compiler does not seem to be impressed with this and will not allow me to overload the method. I have to change the name of either of the methods to make this work:

def parser(identifier: String, default: String): String = genParser[String](identifier, default, identity)

在使用类型参数时,是否有不能重载的原因?

Is there a reason I can't overload when type parameters are in use?

推荐答案

重载不是编译器所关心的.

Overloading is not what the compiler is concerned about.

<console>:8: error: method parser: (identifier: String, default: String) String does not take type parameters.

此代码:

parser[String](identifier, default, identity)

调用这个方法:

def parser(identifier: String, default: String): String

而不是你想要的:

def parser[T](identifier: String, default: T, modifier: String => T): T

这个插图编译得很好:

val args = Array[String]()

def parser[T](identifier: String, default: T, modifier: String => T): T = {
  val l = args.filter(_.startsWith(identifier))
  if(l.isEmpty) default
  else modifier(l(0).drop(identifier.length).trim)
}

def parser(identifier: String, default: String): String = "dummy"

这篇关于使用类型参数时在 Scala 中重载的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆