java模板如何使用模板类型返回函数参数类类型实例

时间:2014-10-24 20:36:39

标签: java templates

我有像这样的模板类.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 ....

请根据需要更正标题。

2 个答案:

答案 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();
     }
}