如何使用Java泛型方法?

时间:2019-03-27 10:07:15

标签: java generics

我正在从C ++迁移到Java。现在,我正在尝试泛型方法。但是编译器总是抱怨下面的错误

  

对于类型T HelloTemplate.java / helloTemplate / src / helloTemplate,未定义方法getValue()

错误指向t.getValue()行 据我了解,T是类MyValue,它具有方法getValue

怎么了?我该如何解决。我正在使用Java1.8

public class MyValue {

    public int getValue() {
       return 0;
    }
}

public class HelloTemplate {

    static <T> int getValue(T t) {
        return t.getValue();
    }
    public static void main(String[] args) {
       MyValue mv = new MyValue();
       System.out.println(getValue(mv));
   }

}

2 个答案:

答案 0 :(得分:6)

编译器不知道您要将具有getValue()方法的类的实例传递给getValue(),这就是t.getValue()不传递编译的原因。

仅当您添加绑定到通用类型参数T的类型时,它才会知道:

static <T extends MyValue> int getValue(T t) {
    return t.getValue();
}

当然,在这样一个简单的示例中,您只需删除通用类型参数并编写:

static int getValue(MyValue t) {
    return t.getValue();
}

答案 1 :(得分:3)

只需要在调用方法之前进行强制转换即可。 return ((MyValue) t).getValue(); ,以便编译器可以知道它正在调用MyValue的方法。

   static <T> int getValue(T t) {
        return ((MyValue) t).getValue();
    }

如果有多个类,则可以使用instanceof运算符检查实例,然后调用方法。如下所示。

  static <T> int getValue(T t) {
        //check for instances
        if (t instanceof MyValue) {
            return ((MyValue) t).getValue();
        }
        //check for your other instance
  return 0; // whatever for your else case.