Java泛型:无法从对象转换为T

Rag*_*eer 2 java generics casting java-8

我有很多响应对象需要提供给 ui。我想要一个模板,这样我就可以做到,到目前为止,下面的代码还没有奏效。

private <T> T getResult(Class clazz){
    String fileName = "/path/file.json";
    File file = new File(BaseEndpoint.class.getResource(fileName.getFile());
    T result = null;

    try {
        result = mapper.readValue(file, clazz);
    } catch (IOException e) {
        e.printStackTrace();
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

And*_*lko 6

T可不行Object。例如,可能是BaseEndpoint因为它满足条件T extends Object

您需要将结果转换mapper.readValue(file, clazz)T

result = (T)mapper.readValue(file, clazz);
Run Code Online (Sandbox Code Playgroud)

@SuppressWarnings("unchecked")如果您确定这个未经检查的演员表是准确的,请提交该方法:

@SuppressWarnings("unchecked")
private <T> T getResult(Class clazz) { ... }
Run Code Online (Sandbox Code Playgroud)

实际上,可以在readValue方法中为您完成转换(如果需要Class<T>),因此您不需要以上任何内容。

是的,我已经检查过了:

@SuppressWarnings("unchecked")
public <T> T readValue(JsonParser p, Class<T> valueType)
    throws IOException, JsonParseException, JsonMappingException
{
    DeserializationContext ctxt = createDeserializationContext(p);
    return (T) _readValue(ctxt, p, _typeFactory.constructType(valueType));
}
Run Code Online (Sandbox Code Playgroud)

这一切都会为你完成。您只需要传递一个正确的Class<T>实例(而不是原始类型Class

  • 对。除此之外,将 `clazz` 声明为 `Class&lt;T&gt;` 可能很有用,以确保这个未经检查的强制转换是准确的,如果我没看错的话。 (2认同)