Java泛型类型和方法

时间:2015-07-16 08:14:42

标签: java generics

我想创建一个获取List参数并创建某个jsonResult的函数。我事先知道我的每个T对象都有一个getId()函数。所以我的方法

private static <T> JsonObject createJsonAarrayResult(List<T> items, Class<T> type){
    JsonObject jsonResult = new JsonObject();
    JsonArray jsonResultItem = new JsonArray();
    for (T item : items){
        JsonObject jsonArrayItem = new JsonObject();
        jsonResultItem.addProperty("id", item.getId());

    }
    return jsonResult;
}

调用item.getId()的行当然会给我一个错误。我怎么能绕过它呢。我也使用type来传递类类型以用于转换。但我仍然得到一个错误。有没有办法使用T但是从特定对象调用方法?

2 个答案:

答案 0 :(得分:11)

例如,你的每个T都会实现一个抽象类的接口,该接口具有此函数的getID()。

E.g:

public interface InterfaceID {
    String getID();
}

然后确保传递给此方法的每个类型实际使用此接口(或您可能已有的任何其他接口/类),您可以使用extends声明泛型:

 private static <T extends InterfaceID> JsonObject createJsonAarrayResult(List<T> items){
    ....
    // The Class<T> parameter is not needed in your example and can be removed.

从现在起,getID()函数可用。

答案 1 :(得分:1)

您收到错误,因为java编译器不知道T有像get Id这样的方法。您可以编写如下界面:

public interface SomeInterface {  
    long getId();
}

然后像这样修改您的界面。

private static <T> JsonObject createJsonAarrayResult(List<SomeInterface> items, Class<T> type){
   ...
}

不要忘记让你的类实现SomeInterface。

另外,你可以使用

<T extends SomeInterface>

解决这个问题。