我正在从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));
}
}
答案 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.