这是我的准则。为什么reflect API返回两个方法?
我定义了一个接口,像这样:
import java.util.List;
public interface Species<T> {
T feed(List<String> numList);
}
Animal是Species的实现类:
import lombok.Data;
import java.util.List;
@Data
public class Animal<T> implements Species<T> {
private T t;
@Override
public T feed(List<String> numList) {
return t;
}
}
Dog类是Animal类的子类:
import java.util.List;
public class Dog extends Animal<String>{
@Override
public String feed(List<String> numList) {
return "dog feed method";
}
}
这是我的测试类,它:
public class TypeTest {
public static void main(String[] args) {
Class<Dog> dogClass = Dog.class;
Method[] declaredMethods = dogClass.getDeclaredMethods();
for(Method m:declaredMethods){
System.out.println(m.getReturnType().getName());
}
}
}
运行输出:
java.lang.String
java.lang.Object
检查变量declaredMethods
:enter image description here
1条答案
按热度按时间7gcisfzg1#
Dog
实际上有两个声明的feed
方法。返回Object
的是返回String
的bridge method。桥方法由编译器生成。桥接方法的实现可以概括为:只需将参数转换为正确的类型,并调用实际的
String
-返回feed
,并返回它返回的内容。由于类型擦除,需要桥接方法。就JVM而言,接口方法返回
Object
,因此作为实现类,Dog
也必须有一个返回Object
的方法。当您通过Animal
接口调用feed
时,JVM无法神奇地找到String
返回方法。它根本不在乎仿制药。