1

使用以下代码:

主.java

 // ...

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

     // ...

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

 // ...

响应.java

 interface Response {
    // ...

    Serializable getDetails();

    // ...
 }

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

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

  return (T)r.getDetails();

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

有没有更好的选择?

4

4 回答 4

5

问题是,根据您的代码, eachT必须是 a Serializable,但不是 everySerializable也是 a T

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

T1 t = new T2();

asT1T2不相关,即使它们都是Serializable.

于 2013-06-12T12:20:04.767 回答
1

您必须将返回的 Object 转换为如下T类型

return (T) r.getDetails();

更新

然后你必须使你的Response接口或getDetails()方法通用。
像这样:

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

T getDetails();

}

或者

interface Response {
// ...

<T extends Serializable> T getDetails();

}
于 2013-06-12T12:13:02.513 回答
1

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

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

// ...

    return r.getDetails();
}

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

    T getDetails();

    // ...
}

但这对于您可能拥有的其他东西来说是不必要的。问题在于 Thorsten Dittmar 已经写过的内容。

于 2013-06-12T12:21:52.970 回答
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;
            }
        }));
    }
}
于 2013-06-12T12:19:30.420 回答