需要在运行时泛型scala传递类

时间:2017-09-10 18:32:38

标签: java scala generics reflection

我认为问题标题不明确,但我试着在这里解释一下。

假设我的课程 A 采用通用类型 T

class A[T] {
    // Doing some thing with T
}

现在我正在实例化它的对象但是代替 T 我将在运行时传递一个类,如

Class.forName("com.somthing.SomeClass")
new A[com.somthing.SomeClass]() //but I don't have com.somthing.SomeClass at compile time

但我怎样才能使用上面的课程?

1 个答案:

答案 0 :(得分:2)

你不能这样做,运行时没有T。在擦除过程中键入参数“消失”,并替换为java.lang.Object

$ echo 'class A[T] { def f(t: T): T = t }' > test.scala 
$ scalac test.scala 
$ javap -c A.class 
Compiled from "test.scala"
public class A<T> {
  public T f(T);
    Code:
       0: aload_1
       1: areturn

  public A();
    Code:
       0: aload_0
       1: invokespecial #19                 // Method java/lang/Object."<init>":()V
       4: return
}