我有一个下面的类,它使用协方差注释和另一个类型参数作为其方法,该类类型参数是下界
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) 我正在学习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)
上面缩短的数组初始化程序在每个语句中都不起作用.
而且可能还有更多这样的不一致......
似乎错误版本是正确的,因为它们是按照定义的语法,非错误版本(对于类似的情况)是语言创建的构造,只是使语言易于编码.
但是在我们使用它的每个地方仍然不一致吗?