使用以下代码:
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")
会抑制警告,但我发现这个解决方案很难看。
还有更好的选择吗?
答案 0 :(得分:5)
问题在于,通过您的代码,每个T
必须是Serializable
,但不是每个Serializable
都是T
。
假设T1
和T2
都是Serializable
,以下情况也会导致问题:
T1 t = new T2();
T1
与T2
无关,即使它们都是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;
}
}));
}
}