我在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)
我试图创建一个这样的实例是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泛型类是否有一些限制?或者我只是在做一些可怕的错误
答案 0 :(得分:5)
您的Tester
类实际上有一个隐含参数(因为[T : Manifest]
类型边界。您使用的语法是糖
// 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){...}
您可以通过在scala编译器生成的Tester.class
文件上运行javap
命令来查看类型签名。
因此,如果您尝试使用Java中的Tester
类,则必须明确地找出scala编译器通常会为您找出的参数。
查看scaladocs,看起来ManifestFactory就是您需要创建Manifest实例的地方。所以你的java代码看起来像
Manifest<Integer> man = ManifestFactory$.MODULE$.classType(Integer.class);
Tester<Integer> tester = new Tester<Integer>("data", 123, man);