簡體   English   中英

如何確定泛型超類的特定子類的ACTUAL返回類型?

[英]how can i determine the ACTUAL return type of a specific subclass of a generic superclass?

我確實知道我嘗試執行的操作實際上不是使用純Java才能實現的-僅當我查看調試信息時才有可能。 無論如何,我不會在沒有調試的情況下進行編譯,因為我的spring mvc的大部分將停止工作。

也就是說,我有以下情況:

一個通用超類:

包com.cinefms.apitester.springmvc.crawlers;

public class TestGenerics<T extends TestGenericsInterface> {

    public T get() {
        return null;
    }

    public T put(T t) {
        return null;
    }

}

及其子類:

package com.cinefms.apitester.springmvc.crawlers;


public class TestGenericsSub extends TestGenerics<TestGenericsImpl> {

}

里面的物體真的很簡單。

接口:

package com.cinefms.apitester.springmvc.crawlers;

public interface TestGenericsInterface {

}

它的實現:

package com.cinefms.apitester.springmvc.crawlers;

public class TestGenericsImpl implements TestGenericsInterface {

}

eclipse很好,弄清楚了TestGenericsSub.get()應該返回一個TestGenericsImpl的實例...即使沒有可用的源。

但是我如何在運行時自己弄清楚呢?

如果“ m”是方法“運行”,則

m.getGenericReturnType();

將返回“ T”(無用),而:

m.getReturnType();

給我“ TestGenericsInterface”(也無濟於事)。 我一直在看“ org.javaruntype”庫...但是我似乎無法弄清楚。

有人可以解釋嗎?

謝謝!

由於Java類型擦除( https://docs.oracle.com/javase/tutorial/java/generics/genTypes.html ),這非常困難。 如果您絕對必須知道T的運行時類型,建議將類另存為屬性,然后提供一個吸氣劑。

public class MyGenericClass<T> {

    private final Class<T> type;

    public MyGenericClass(Class<T> type) {
        this.type = type;
    }

    public Class<T> getMyType() {
        return this.type;
    }
}

否則,您可以嘗試以下操作:

(Class<T extends TestGenericsInterface>) ((TestGenerics) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

在代碼中,我更喜歡前一種解決方案。

您可以使用ClassMate實現:

TypeResolver typeResolver = new TypeResolver();
MemberResolver memberResolver = new MemberResolver(typeResolver);

ResolvedType resolvedType = typeResolver.resolve(TestGenericsSub.class);
ResolvedTypeWithMembers resolvedTypeWithMembers = memberResolver.resolve(resolvedType, null, null);
ResolvedMethod resolvedGetMethod = resolvedTypeWithMembers.getMemberMethods()[0];

System.out.println(resolvedGetMethod.getReturnType()); // TestGenericsImpl

TypeTools是另一種選擇:

Class<?> t = TypeResolver.resolveRawArgument(TestGenerics.class, TestGenericsSub.class);

結果是預期的:

assert t == TestGenericsImpl.class;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM