为什么我会收到此错误“类型不匹配:无法从Serializable转换为T”?

时间:2013-06-12 12:09:01

标签: java generics serialization casting

使用以下代码:

Main.java

 // ...

 private static <T extends Serializable> T doStuff() {
     Response r = ...

     // ...

     return r.getDetails();//Error here
 }

 // ...

Response.java

 interface Response {
    // ...

    Serializable getDetails();

    // ...
 }

我收到此编译错误:“类型不匹配:无法在doStuff方法中从Serializable转换为T”。

如果我转换返回的结果,则会删除错误。

  return (T)r.getDetails();

但现在我有这个警告:Type safety: Unchecked cast from Serializable to T@SuppressWarnings("unchecked")会抑制警告,但我发现这个解决方案很难看。

还有更好的选择吗?

4 个答案:

答案 0 :(得分:5)

问题在于,通过您的代码,每个T必须是Serializable,但不是每个Serializable都是T

假设T1T2都是Serializable,以下情况也会导致问题:

T1 t = new T2();

T1T2无关,即使它们都是Serializable

答案 1 :(得分:1)

您必须将返回的对象转换为T类型
像这样:

return (T) r.getDetails();

<强>更新

然后,您必须使Response界面或getDetails()方法通用 像这样:

interface Response<T extends Serializable> {
// ...

T getDetails();

}

interface Response {
// ...

<T extends Serializable> T getDetails();

}

答案 2 :(得分:1)

如果您提供的实施细节太少,我建议您Response通用:

private static <T extends Serializable> T doStuff() {
    Response<T> r = ...;

// ...

    return r.getDetails();
}

interface Response<T extends Serializable> {
    // ...

    T getDetails();

    // ...
}

但是,对于你可能拥有的其他东西,这不是必要的。问题是Thorsten Dittmar已经写过的。

答案 3 :(得分:0)

以下所有内容都会编写没有警告的内容,应该会给你一个想法:

interface Response<T extends Serializable> {
    T getResponse();
}


class Sample {
    private static <T extends Serializable> T get(Response<T> generator) {
        return generator.getResponse();
    }

    public static void main(String[] args) {
        System.out.println(get(new Response<Serializable>() {
            @Override
            public String getResponse() {
                return "string";
            }
        }));
        System.out.println(get(new Response<Serializable>() {
            @Override
            public Integer getResponse() {
                return 1;
            }
        }));
    }
}