Lambda表達(dá)式代替匿名內(nèi)部類時(shí)無(wú)法獲取接口泛型類型問(wèn)題

假設(shè)有一個(gè)泛型接口Callback和一個(gè)JavaBean類:

    public class JavaBean {
        public String name;
    }

    public interface Callback<T> {

        void onSucess(T t);
    }

再來(lái)一個(gè)測(cè)試方法test()用于獲取參數(shù)callback的泛型類型

class TestDemo {

    private <T> void test(Callback<T> callback) {
        Type type = getTypeFromInterface(callback);
        if (type != null) {
            System.out.println(type.getTypeName());
        } else {
            System.out.println("未指定泛型");
        }
    }

    private <T> Type getTypeFromInterface(Callback<T> callBack) {
        try {
            Type[] interfaceTypes = callBack.getClass().getGenericInterfaces();
            Type type;
            if (interfaceTypes.length == 0) {
                //非接口
                type = callBack.getClass().getGenericSuperclass();
            } else {
                type = interfaceTypes[0];
            }
            if (type == null) {
                return null;
            }
            if (ParameterizedType.class.isAssignableFrom(type.getClass())) {
                return (((ParameterizedType) type).getActualTypeArguments())[0];
            }
        } catch (Exception e) {
            return null;
        }
        return null;
    }

}

正常調(diào)用test方法,是用匿名內(nèi)部類的方式:

    public static void main(String[] args) {
        TestDemo demo = new TestDemo();
        // 匿名內(nèi)部類
        demo.test(new Callback<String>() {
            @Override
            public void onSucess(String o) {

            }
        });
        demo.test(new Callback<JavaBean>() {
            @Override
            public void onSucess(JavaBean o) {

            }
        });
        demo.test(new Callback<List<JavaBean>>() {
            @Override
            public void onSucess(List<JavaBean> o) {

            }
        });
    }

運(yùn)行查看輸出如下:

java.lang.String
***.***.JavaBean
java.util.List<***.***.JavaBean>

說(shuō)明這樣能夠獲取泛型類型。但是這種匿名內(nèi)部類的方式開(kāi)發(fā)工具會(huì)提示用lambda代替。

    public static void main(String[] args) {
        TestDemo demo = new TestDemo();
        // lambda表達(dá)式
        demo.test((Callback<String>) s -> {
        });
        demo.test((Callback<JavaBean>) s -> {
        });
        demo.test((Callback<List<JavaBean>>) s -> {
        });
    }

然后再運(yùn)行下,查看輸出,居然獲取不到泛型類型?。?!

未指定泛型
未指定泛型
未指定泛型

請(qǐng)問(wèn)各位大佬,這是為什么呢?如果想用lambda表達(dá)式那要怎么獲取接口的泛型類型呢?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容