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條經驗 獲得超6個贊
這可能有效,但我不建議這樣做。請注意,要使其正常工作,必須不是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);
}
通常,您正在做的事情可以通過創建一個創建特定類實例的工廠接口來實現。
添加回答
舉報