我正在尝试实现近似于以下内容:
public class MyClass<E>
{
protected MyClass(Object[] variables)
{
//init
}
public MyClass(Comparator<? super E> comp, Object[] variables)
{
//init
}
public static <K extends Comparable<? super K>, T extends MyClass<K>>
T construct(T example, Object[] variables)
{
return new T(variables);
}
}
Object[] 变量不是实际代码,而是构造的实际参数的占位符。
我的问题就在于此。我已经看到很多例子,无论有没有反射,当 T 的构造函数的参数提前知道时如何做到这一点,因此可以在构造的参数中指定。但是,即使 T 的构造函数的参数未知,我也希望能够做到这一点。有没有办法做到这一点?
我并不特别关心解决方案是否使用反射,只要它有效,但反射似乎是最有可能的选择。
作为一个整体,我对反思相当陌生,所以如果这个问题相当基本,我深表歉意。
编辑:由于反馈无法动态设置construct()我想稍微改变问题的参数。
假设受保护的构造函数具有类构造所需的参数,如果我使用vararg (public static <K extends Comparable<? super K>, T extends MyClass<K>>
T construct(T example, Object... variables))确保传递给变量的参数与构造函数所需的参数匹配的最佳方法是什么?我曾希望动态地执行此操作,因为编译器本身会防止此类问题,但如果没有这种可能性,我要求最好的替代解决方案。
编辑:为澄清起见,这是我的实际目标:我希望 MyClass 接受扩展 Comparable 的参数化E或任何参数化,但传入一个 Comparator。我可以简单地通过构造函数实现第二个目标,但是为了让 E 在第二种情况下对任何选项开放,我必须将它对任何选项开放。为了解决这个问题,我对通用构造函数进行了保护,并创建了一个公共静态方法来强制 Comparable 实现并充当伪构造函数,返回类型为 MyClass,其中 K 是 Comparable。但是,当另一个类扩展 MyClass 时,这会导致问题。如果我事先知道继承类将具有与 MyClass 相同的参数,那么我可以简单地隐藏该方法并相应地更改返回类型。但是如果我想让子类有不同的参数,那么我已经改变了方法的签名,不能再用它来隐藏前一个,这意味着子类不仅可以返回自己的实例,还可以返回其父类的完全不同的实例。这是我想尽量避免的。
摇曳的蔷薇
拉风的咖菲猫
ibeautiful
相关分类