我试过了
type ?[_] = Option[_]
def f(x: ?[Int]) = for (y <- x) yield y
Run Code Online (Sandbox Code Playgroud)
(但我不知道我在做什么.)
只要类型只是对象,我应该能够定义一个postix运算符(即零arity方法),用于类型签名(我认为).它可能需要像这样的空间
def f(x: Int ?) = for (y <- x) yield y
Run Code Online (Sandbox Code Playgroud)
使用scala可以很容易地使用具有匹配和多态的Option类型,避免使用null.但是,大多数类都是(可空)变量,而java经常返回变量.使用类和调用java是scala的两个卖点.易于编写且易于阅读的语法将更强烈地支持选项.
scala用"?"做的所有事情是什么?使其解析特别.
理想情况下,人们可以写
def f(x:Int?)= for(y < - x)产生y
像其他语言一样.我们可以在scala(没有宏)中执行此操作吗?
首先,类型不是对象.实际上,Scala只有两个名称空间:值和类型.它们是非常不同的东西,并且遵循非常不同的规则.
实际上,后缀的想法很不错,但这是不可能的.但是,有一种类型的中缀表示法.
现在,你写的:
type ?[_] = Option[_]
Run Code Online (Sandbox Code Playgroud)
每个下划线都有不同的含义.?[_]平均值中的下划线?是更高的,但你不关心它的类型参数是什么.Option[_]手段中的下划线Option是存在类型.因此,当您编写时x: ?[Int],Scala会将其转换为x: Option[t] { forSome type t }.这意味着你不仅没有得到Int,而且类型参数Option是不可知的(你只知道它存在).
但是,它确实编译:
scala> def f(x: ?[Int]) = for (y <- x) yield y
f: (x: ?[Int])Option[Any]
Run Code Online (Sandbox Code Playgroud)
您使用的是哪个版本的Scala?2.11?我的同事已经在2.11上找到了一些类型推断回归,所以可能就是这样.
编写类型别名的正确方法是:
type ?[+A] = Option[A]
Run Code Online (Sandbox Code Playgroud)
我们不仅传递了类型参数(毕竟它是一个参数!),但我们需要指定它的共同方差才能正常行动Option(这是共变体本身).
现在,至于你的两个问题,Scala绝对没有特别的待遇?.而且,不,你不能这样做.这?在语言中并不完全普遍,并且在支持它的所有语言中,它都是用语言构建的,而不是外部定义的.
除此之外,当与Java接口时,键入Option是一个问题 - 而不是Java中的平均标识符大小,这是一个笑话!