gpt4 book ai didi

java - 在 java 中使用 scala 泛型类

转载 作者:搜寻专家 更新时间:2023-11-01 02:26:28 25 4
gpt4 key购买 nike

我在 Scala 中有这个:

object Tester {
def apply[T : Manifest](description: String, initValue: T) = new Tester[T](description, initValue)
implicit def TesterToValue[T](j: Tester[T]): T = j.value
}

class Tester[T : Manifest](someData: String, initValue: T) {
private var value = initValue
def getValue : T = value
}

这让我可以做

val t1 = JmxValue("some data", 4)

我正在尝试创建一个 this is java 的实例,到目前为止我还没有成功我试过:

Tester t1 = Tester<Integer>("data", 0);
Tester<Integer> t1 = Tester<Integer>("data", 0);
Tester t1 = Tester("data", 0);
Tester t1 = new Tester<Integer>("data", 0);
Tester<Integer> t1 = new Tester<Integer>("data", 0);

在 java 中使用 scala 泛型类有什么限制吗?还是我只是做错了一些可怕的事情

最佳答案

您的 Tester 类实际上有一个隐式参数(因为 [T : Manifest] 类型边界。您使用的语法是 sugar for

// Scala Class
class Tester[T](someData: String, initValue: T)(implicit man: Manifest[T]){...}

当它被编译时,两个参数列表被压缩为一个,所以你最终得到了 java 等价物

//Java Constructor
public Tester(String someData, T initValue, Manifest<T> man){...}

您可以通过运行 javap 查看类型签名Tester.class 文件上的命令,该文件由 scala 编译器生成。

因此,如果您尝试使用 Java 中的 Tester 类,则必须明确找出 scala 编译器通常会为您找出的参数。

查看scaladocs,它看起来像ManifestFactory是您需要去创建 list 实例的地方。所以你的java代码看起来像

Manifest<Integer> man = ManifestFactory$.MODULE$.classType(Integer.class);
Tester<Integer> tester = new Tester<Integer>("data", 123, man);

关于java - 在 java 中使用 scala 泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21767292/

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