gpt4 book ai didi

java - 在什么情况下scala正确地将String转换为java.lang.String

转载 作者:行者123 更新时间:2023-12-01 21:25:48 25 4
gpt4 key购买 nike

假设我创建了一个单参数泛型方法:

trait MyTrait[T] {
def method():T
}

然后扩展它并参数化。这:

class MyClass extends MyTrait[java.lang.String] {
def method() = "foo"
}

与此相同:

class MyClass extends MyTrait[String] {
def method() = "foo"
}

但是,当您创建一个像这样参数化 lambda 的特征方法时:

trait MyTrait {
def apply[T](input:()=>T):T
}

那你就没那么幸运了。这:

class MyClass extends MyTrait {
def apply(input:()=>java.lang.String) = "foo"
}

会导致这样的情况:

Error:(25, 45) type mismatch;
found : java.lang.String("foo")
required: String
def apply[String](input:()=>String) = "foo"
^

但是,这很好:

class MyClass extends MyTrait {
def apply[String](input:()=>String) = new String("foo")
}

那么在什么情况下 scalac 实际上知道需要进行转换,在什么情况下不知道?

此外,即使我写出java.lang.String类型的整个路径

class MyClass extends MyTrait {
def apply[java.lang.String](input:()=>java.lang.String) = new java.lang.String("foo")
}

它抛出另一个错误:

Error:(25, 21) ']' expected but '.' found.
def apply[java.lang.String](input:()=>java.lang.String) = new java.lang.String("foo")
^

如果我想通过直接模板化 java.lang.String 来实际做到后一种方式,我将如何去做?

最佳答案

这个

class MyClass extends MyTrait {
def apply[String](input:()=>String) = new String("foo")
}

不太好。它会导致需要类类型,但找到 String。这里的问题是,当您使用参数化方法扩展类时,您没有声明什么是类型参数。您在使用该方法时声明它。

让我们重写一下:

class MyClass extends MyTrait {
def apply[String](input:()=>String) = input()
}

现在观察:

scala> (new MyClass).apply[String](() => "foo")
res0: String = foo

scala> (new MyClass).apply[Int](() => 5)
res1: Int = 5

它之所以有效,是因为当你声明这个时:

  def apply[String](input:()=>String) = input()

String参数的名称。如果您编写的是 TXyzzyManISuckAtTypeParameters 而不是上面的 String,那么它们将是完全相同的。您说您将获得一个类型参数,您将命名该类型参数String,这就是返回函数的值,并且通过覆盖,应用方法。

当我调用 apply[Int](() => 5) 时,Scala 会将定义中的 String 替换为 整数

关于java - 在什么情况下scala正确地将String转换为java.lang.String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38167230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com