gpt4 book ai didi

java - 从 Scala 访问参数化 Java 类的静态方法

转载 作者:行者123 更新时间:2023-11-30 10:45:07 24 4
gpt4 key购买 nike

在 Scala 中,我正在做一些 Java 互操作。我正在创建类 Sample.Individual 的值,并且我正在调用静态 Java 方法,如 Sample.Individual.newBuilder()。我使用的几个类都具有相同的静态方法(例如:Sample.PositionSample.Feature)。我想制作一个参数化它们的函数,比如:

def p[T](s: String): T = {
val pb = T.newBuilder() // this returns a value of type T.Builder
... do stuff with pb ...
pb.build() // this returns a value of type T
}

但这告诉我“未找到:值 T”

参数化 Sample.Individual 类型的正确方法是什么,这样我还可以从 Scala 调用其中包含的静态方法?

最佳答案

我强烈建议您不要提出这个想法。即使您找到了一种方法,它也不是惯用的 Scala。削减几行代码的可能性微乎其微,但可读性和性能却有所下降;糟糕的权衡。

您遇到的问题是您给p 函数一个类型参数T,然后调用newBuilder 方法在那个类型 T 上。你不能那样做,因为 Scala 对你的类型 T 一无所知。

相反,首先要多了解一下这些 Java 类型。所有可能构造的类都扩展了一个公共(public)类型吗?如果不是,那你就倒霉了(如果你选择拉皮条你正在使用的库,从技术上讲你并没有倒霉,但请不要 :P)。

否则,只需导入那些类型(包括通用类型)。将通用类型作为您的 p 函数的类型并匹配字符串,然后实例化您的类型。字符串可以是任何内容,因此您可能希望返回 Option[GenericClass] 而不是 GenericClass

例如

import xxx.GenericClassBuilder
import xxx.GenericClass
import xxx.ClassA
import xxx.ClassB

def p(s: String): Option[GenericClass] = {
val maybePb: Option[GenericClassBuilder] = s match {
case "ClassA" => Some(ClassA.newBuilder())
case "ClassB" => Some(ClassB.newBuilder())
case _ => None
}
maybePb.foreach { pb => ... do side-effecty stuff with pb ...}
maybePb.map(_.build())
}

关于java - 从 Scala 访问参数化 Java 类的静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37175096/

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