-1

我想知道是否可以创建一个构造函数:


public <C, T> C newInstance(Class<C> constructor_class,
                              Class<T> type,
                              Object...parameters){
     // create a new Instance with the generic type and the paramters
     
     //so basicly like this, but with generics and parameters
     return constructor_class.newInstance();
}


4

1 回答 1

1

你基本上不能。你的例子被打破了 -type应该代表什么?

假设您要动态创建一个HashMap<String, Integer>. 这需要你传入HashMap.class,String.classInteger.class,但是我们马上就遇到了很多问题:

  • 我们怎么知道 HashMap 有 2 个参数?我们没有,因此您必须通过可变参数传递 2 个类引用,并且在运行时我猜如果您传递了错误数量的类,我们会抛出异常。
  • 如果你传递了根本无法实例化的 Map 怎么办?
  • 但最重要的是,这完全没用,没有出现在方法/字段/类签名中的泛型是编译器想象的虚构:javac 在编译期间使用它来警告或错误,以及生成不可见的种姓操作,以及然后把这个信息扔掉。通过动态地执行它,所有“在编译时”的东西都不能按定义工作(我们正在编译,而不是运行,重点是类型是动态的,所以 javac 不能这样做),所以对于 javac 它是无用的,然后信息被丢弃。所以这让它完全没用,那么,不是吗?

此外,Class不能用于传达泛型参数。如果我想要一个HashMap<List<String>, Integer>呢?List<String>不作为类文字存在,因此java.lang.Class<T>不能在此处使用。还有一些类对象(特别是int.class)在泛型中是不合法的。因此,我们有?, ? super Foo, A, B extends A, C extends A & Serializable,所有作为可以进入但不能作为参考List<String>的事物的示例,这是一个合法的类 ref 但不能进入。你不能把方钉放在圆孔里。更不用说即使你可以,它实际上也不会做任何事情(见第 3 点:这是没用的——大多数泛型,当然你在这里使用的泛型,会影响编译并在之后不复存在)。<>java.lang.Classint.class<>

这个领域有很多疯狂的技巧(例如超级类型标记),但是如果你不完全理解泛型是如何在后台工作的,那么你有 0.00001% 或更少的机会可以有效地使用这些技巧,所以不要'在那之前不要打扰。问这个问题,尤其是那个伪代码,强烈表明你对它的理解还不够。

于 2020-09-27T00:50:36.990 回答