小编Sur*_*rat的帖子

当未显式指定类型参数时,Scala 下限类型参数不起作用

我有一个下面的类,它使用协方差注释和另一个类型参数作为其方法,该类类型参数是下界

class MyQueue[+T]{
  def add[U >: T](arg:U):Unit= {
    println("Arg value :"+ arg)
  }
}
Run Code Online (Sandbox Code Playgroud)

鉴于上面的代码,我不明白为什么下面的行执行成功。根据我对下限的理解,方法“add”应该只接受 Int 类型或其超类型的值。

val q1:MyQueue[Int] = new MyQueue[Int]
q1.add("string")
Run Code Online (Sandbox Code Playgroud)

但是,如果我们如下显式指定类型参数,它会给出预期的编译错误(String 不符合方法 add 的类型参数界限)

q1.add[String]("string")
Run Code Online (Sandbox Code Playgroud)

scala covariance type-parameter type-bounds

2
推荐指数
1
解决办法
467
查看次数

C#语言语法不一致

我正在学习C#并遇到一些让我对它的语法感到不舒服的事情.

情况1

byte num1 = 10;    // works
int ten = 10;
byte num2 = ten;   // Compile error: Cannot implicitly convert 'int' to byte. An explicit conversion exists.
Run Code Online (Sandbox Code Playgroud)

在第一个语句中,编译器隐式地将文字10(类型为int)强制转换为byte,相反,它在第三个语句中不执行相同操作.

案例2

int[] numbers1 = { 10, 20, 30 };     // works
int[] numbers2;
numbers2 = { 10, 20, 30 };          // Compiler error: Invalid expression term: {
Run Code Online (Sandbox Code Playgroud)

上面缩短的数组初始化程序在每个语句中都不起作用.

而且可能还有更多这样的不一致......

似乎错误版本是正确的,因为它们是按照定义的语法,非错误版本(对于类似的情况)是语言创建的构造,只是使语言易于编码.

但是在我们使用它的每个地方仍然不一致吗?

c# language-design implicit-conversion

0
推荐指数
1
解决办法
183
查看次数