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>>() {});