Java 选中参数化泛型抽象类对它的强制转换';实施
我有一个复杂的方法,它返回Java 选中参数化泛型抽象类对它的强制转换';实施,java,generics,Java,Generics,我有一个复杂的方法,它返回衍射结果的不同实现。我想对实现执行一个checkedcast,以便调用它的方法并断言结果 // this is ok DiffResult<MockVersion, String> result = calculator.diff(a, b); // this is problem NewCurrentVersionDiffResult<MockVersion, String> newCurrentVersionDiffResult = ass
衍射结果的不同实现。我想对实现执行一个checkedcast,以便调用它的方法并断言结果
// this is ok
DiffResult<MockVersion, String> result = calculator.diff(a, b);
// this is problem
NewCurrentVersionDiffResult<MockVersion, String> newCurrentVersionDiffResult = assertDiffType(result, NewCurrentVersionDiffResult.class);
// this is ok
Assert.assertEquals("expected", newCurrentVersionDiffResult.getNewValue());
我试过这个
private static <D extends DiffResult<T, V>, T extends ProductDataVersion<T>, V> D assertDiffType(final DiffResult<T, V> result, final Class<D> type)
{
Assert.assertThat(result, CoreMatchers.instanceOf(type));
return type.cast(result);
}
而不是
NewCurrentVersionDiffResult<MockVersion, String> newCurrentVersionDiffResult =
NewCurrentVersionDiffResult NewCurrentVersionDiffResult=
另外,警告是在调用assertDiffType()
方法时发出的,而不是在方法本身上。使用所需类型的最佳方法,但您可以使用此@SuppressWarnings(“未选中”)来抑制警告,在少数情况下,我们不能做太多,必须使用@SuppressWarnings(“未选中”)如果不可能您正在将NewCurrentVersionDiffResult.class
传递给class
参数的方法,该参数决定D
的类型,这也是返回类型。请注意,NewCurrentVersionDiffResult
中缺少通用参数。这就是该方法返回原始类型的原因
不幸的是,您不能只执行NewCurrentVersionDiffResult.class
。如何处理这个问题,;长话短说,你应该使用从
@SuppressWarnings(“未选中”)
私有静态D assertDiffType(最终衍射结果,最终类型令牌类型){
Assert.assertThat(result,CoreMatchers.instanceOf(type.getRawType());
返回(D)结果;
}
使用此功能,您可以执行以下操作:
NewCurrentVersionDiffResult<MockVersion, String> newCurrentVersionDiffResult = assertDiffType(result,
new TypeToken<NewCurrentVersionDiffResult<MockVersion, String>>() {});
NewCurrentVersionDiffResult NewCurrentVersionDiffResult=assertDiffType(结果,
新的TypeToken(){});
谢谢,但这不是问题的解决方案,我已经更新了问题。
NewCurrentVersionDiffResult newCurrentVersionDiffResult =
NewCurrentVersionDiffResult<MockVersion, String> newCurrentVersionDiffResult =
@SuppressWarnings("unchecked")
private static <D extends DiffResult<T, V>, T extends ProductDataVersion<T>, V> D assertDiffType(final DiffResult<T, V> result, final TypeToken<D> type) {
Assert.assertThat(result, CoreMatchers.instanceOf(type.getRawType()));
return (D) result;
}
NewCurrentVersionDiffResult<MockVersion, String> newCurrentVersionDiffResult = assertDiffType(result,
new TypeToken<NewCurrentVersionDiffResult<MockVersion, String>>() {});