Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“#”操作符在Scala中是什么意思?_Scala_Type Systems - Fatal编程技术网

“#”操作符在Scala中是什么意思?

“#”操作符在Scala中是什么意思?,scala,type-systems,Scala,Type Systems,我在这个博客中看到了以下代码: //定义抽象类型和边界 特征重现{ 键入Next它被称为类型投影,用于访问类型成员 scala> trait R { | type A = Int | } defined trait R scala> val x = null.asInstanceOf[R#A] x: Int = 0 基本上,它是在其他类中引用类的一种方式 (查找“磅”)解释它,首先我们必须解释Scala中的嵌套类。 class A { class B

我在这个博客中看到了以下代码:

//定义抽象类型和边界
特征重现{

键入Next它被称为类型投影,用于访问类型成员

scala> trait R {
     |   type A = Int
     | }
defined trait R

scala> val x = null.asInstanceOf[R#A]
x: Int = 0

基本上,它是在其他类中引用类的一种方式


(查找“磅”)

解释它,首先我们必须解释Scala中的嵌套类。
class A {
  class B

  def f(b: B) = println("Got my B!")
}
现在让我们尝试一下:

scala> val a1 = new A
a1: A = A@2fa8ecf4

scala> val a2 = new A
a2: A = A@4bed4c8

scala> a2.f(new a1.B)
<console>:11: error: type mismatch;
 found   : a1.B
 required: a2.B
              a2.f(new a1.B)
                   ^
并尝试:

scala> val a1 = new A
a1: A = A@1497b7b1

scala> val a2 = new A
a2: A = A@2607c28c

scala> a2.f(new a1.B)
<console>:11: error: type mismatch;
 found   : a1.B
 required: a2.B
              a2.f(new a1.B)
                   ^

scala> a2.g(new a1.B)
Got a B.
scala>val a1=新的
a1:A=A@1497b7b1
scala>val a2=新A
a2:A=A@2607c28c
scala>a2.f(新a1.B)
:11:错误:类型不匹配;
发现:a1.B
所需:a2.B
a2.f(新a1.B)
^
scala>a2.g(新a1.B)
得了B。

这里有一个搜索“符号运算符”(实际上是方法)的资源,但我还没有找到如何在scalex中转义“#”进行搜索的方法


这是一个非答案。它基本上显示了与问题相同的代码,只是略为缩短。例如,点与点之间的差异表示法是什么?在真实代码中,我在哪里使用它?@notan3x它可能不是你想问的问题的答案。但你问的是“……我从未见过。因为很难搜索它(被搜索引擎忽略了),谁能告诉我这是什么意思?“磅符号”有时被称为“octathrop”(谷歌搜索把我带到了这个页面)。让这成为像#+和#-(参见)有一个全面的列表吗?很好的例子。我完全同意它是这样工作的,但很难理解:scala>classOf[a#B]res7:Class[a#B]=Class a$B scala>classOf[a.B]res8:Class[a.B]=类A$B。这意味着,它们实际上具有相同的类型?它们的值具有相同的字符串表示形式--甚至可能相等。
class
是Java类的运行时表示形式,即使在Java中也是有限的。例如,
List
List
具有相同的运行时
class
。如果
class
不够丰富,无法表示Java类型,它在表示Scala类型时几乎毫无用处。同样,
res7:Class[A#B]=Class A$B
,等号左边是类型,如果值是类的Java运行时表示,则等号右边是类型。
class A {
  class B

  def f(b: B) = println("Got my B!")
  def g(b: A#B) = println("Got a B.")
}
scala> val a1 = new A
a1: A = A@1497b7b1

scala> val a2 = new A
a2: A = A@2607c28c

scala> a2.f(new a1.B)
<console>:11: error: type mismatch;
 found   : a1.B
 required: a2.B
              a2.f(new a1.B)
                   ^

scala> a2.g(new a1.B)
Got a B.