我有像这样的模板类.Msg是已知的类型
class ResultSet<T extends Msg>
{
}
然后在我的app类中我想要这样的功能。
class App
{
public ResultSet<? extends Msg> getResult(Class<? extends Msg> cls)
{
return new ResultSet();
}
}
我有来自Msg类的消息 让我们说
class HelloMsg extends Msg
{
String greeting = null;
}
但我不能使用getResult函数
ResultSet<HelloMsg> rs = getResult(HelloMsg.class);
错误是: 不兼容的类型:ResultSet ....
请根据需要更正标题。
答案 0 :(得分:1)
问题是这个方法签名:
public ResultSet<? extends Msg> getResult(Class<? extends Msg> cls)
返回的泛型类型与参数类型之间没有“连接”,但同一父类除外,因为?
是通配符。这就是编译器提到不兼容类型的原因,因为返回的类型是由参数提供的不同类型。有关详细信息,请参阅此问题:java generics : fancy capture collision。
要解决此问题,您可以按如下方式更改App
课程:
class App<T extends Msg> {
public ResultSet<T> getResult() { // no need for a method parameter anymore
return new ResultSet<>(); // don't forget the diamond operator here
}
}
答案 1 :(得分:1)
class App
{
public <T extends Msg> ResultSet<T> getResult(Class<T> cls)
{
return new ResultSet();
}
}