为什么java reflect机制创建了这两个方法

kg7wmglp  于 2023-04-28  发布在  Java
关注(0)|答案(1)|浏览(113)

这是我的准则。为什么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

7gcisfzg

7gcisfzg1#

Dog实际上有两个声明的feed方法。返回Object的是返回Stringbridge method。桥方法由编译器生成。
桥接方法的实现可以概括为:只需将参数转换为正确的类型,并调用实际的String-返回feed,并返回它返回的内容。
由于类型擦除,需要桥接方法。就JVM而言,接口方法返回Object,因此作为实现类,Dog也必须有一个返回Object的方法。当您通过Animal接口调用feed时,JVM无法神奇地找到String返回方法。它根本不在乎仿制药。

相关问题