3 回答

TA贡献1793条经验 获得超6个赞
我认为你不需要进行反思。您只需要简化您的需求并使用 java 和泛型的强大功能来满足您的需求。这是根据您的第三次编辑的示例:
class MyClass<E> {
private Comparator<MyClass<E>> comparator;
public MyClass(List<Object> params, Comparator<MyClass<E>> comparator) {
//init
this.comparator = comparator;
}
}
class MyClassExtension extends MyClass<Integer> {
public MyClassExtension(List<Object> params, Comparator<MyClass<java.lang.Integer>> comparator) {
super(params, comparator);
}
}
class MyClassExtension2<E> extends MyClass<E> {
public MyClassExtension2(List<Object> params, Comparator<MyClass<E>> comparator) {
super(params, comparator);
}
}

TA贡献1995条经验 获得超2个赞
我想我自己可能已经意识到了一个潜在的解决方案,尽管我希望得到关于它的可行性的反馈。
public class MyClass<E>
{
public MyClass(Comparable<? super E> example, E example2, Object[] variables)
throws IllegalArgumentException
{
if(!example.getClass().equals(example2.getClass())
{
throw new IllegalArgumentException();
}
//init
}
public MyClass(Comparator<? super E> comp, Object[] variables)
{
//init
}
}
这个想法是 if 语句强制example成为与泛型 E 相同的类,并且example作为参数的存在强制该类实现 Comparable。

TA贡献1993条经验 获得超5个赞
这可能有效,但我不建议这样做。请注意,要使其正常工作,必须不是example所有成员variablesnull
public static <K extends Comparable<? super K>, T extends MyClass<K>>
T construct(T example, Object[] variables) throws
NoSuchMethodException,
SecurityException,
InstantiationException,
IllegalAccessException,
IllegalArgumentException,
InvocationTargetException
{
Objects.requireNotNull(example);
Class<?>[] argTypes = new Class<?>[variables.length];
for ( int i = 0; i < variables.length; ++i)
{
// This will NPE if variables[i] is null
argTypes[i] = variables[i].getClass();
}
// This will throw, if constructor is not defined
Constructor<?> constructor = example.getClass().getConstructor(argTypes);
return (T) constructor.newInstance(variables);
}
通常,您正在做的事情可以通过创建一个创建特定类实例的工厂接口来实现。
添加回答
举报