第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何確定泛型類型的類?

如何確定泛型類型的類?

紅糖糍粑 2019-07-17 16:25:41
如何確定泛型類型的類?我正在創(chuàng)建一個(gè)泛型類,在其中一個(gè)方法中,我需要知道當(dāng)前使用的泛型類型的類。原因是我調(diào)用的方法之一期望這是一個(gè)參數(shù)。例子:public class MyGenericClass<T> {   public void doSomething() {     // Snip...     // Call to a 3rd party lib     T bean = (T)someObject.create(T.class);     // Snip...   }}顯然,上面的示例不起作用,并導(dǎo)致以下錯(cuò)誤:類型參數(shù)T的非法類文字。我的問(wèn)題是:有人知道一個(gè)很好的替代方案或解決辦法嗎?
查看完整描述

3 回答

?
12345678_0001

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊

同樣的問(wèn)題:一般信息在運(yùn)行時(shí)被刪除,無(wú)法恢復(fù)。解決方法是在靜態(tài)方法的參數(shù)中傳遞類T:

public class MyGenericClass<T> {

    private final Class<T> clazz;

    public static <U> MyGenericClass<U> createMyGeneric(Class<U> clazz) {
        return new MyGenericClass<U>(clazz);
    }

    protected MyGenericClass(Class<T> clazz) {
        this.clazz = clazz;
    }

    public void doSomething() {
        T instance = clazz.newInstance();
    }}

很丑,但很管用。


查看完整回答
反對(duì) 回復(fù) 2019-07-17
?
富國(guó)滬深

TA貢獻(xiàn)1790條經(jīng)驗(yàn) 獲得超9個(gè)贊

我剛剛提到了這個(gè)解決方案:


import java.lang.reflect.ParameterizedType;


public abstract class A<B> {

    public Class<B> g() throws Exception {

        ParameterizedType superclass =

            (ParameterizedType) getClass().getGenericSuperclass();


        return (Class<B>) superclass.getActualTypeArguments()[0];

    }

}

如果A由子類提供具體類型:


new A<String>() {}.g() // this will work


class B extends A<String> {}

new B().g() // this will work


class C<T> extends A<T> {}

new C<String>().g() // this will NOT work


查看完整回答
反對(duì) 回復(fù) 2019-07-17
?
天涯盡頭無(wú)女友

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊

不幸的是,Christoph的解決方案只在非常有限的情況下起作用。[編輯:正如下面的評(píng)論,我不再記得我對(duì)這句話的推理,這很可能是錯(cuò)誤的:“注意,這只會(huì)在抽象類中起作用,首先。”下一個(gè)困難是g()的直接子類工作。A..不過(guò),我們可以解決這個(gè)問(wèn)題:

private Class<?> extractClassFromType(Type t) throws ClassCastException {
    if (t instanceof Class<?>) {
        return (Class<?>)t;
    }
    return (Class<?>)((ParameterizedType)t).getRawType();}public Class<B> g() throws ClassCastException {
    Class<?> superClass = getClass(); // initial value
    Type superType;
    do {
        superType = superClass.getGenericSuperclass();
        superClass = extractClassFromType(superType);
    } while (! (superClass.equals(A.class)));

    Type actualArg = ((ParameterizedType)superType).getActualTypeArguments()[0];
    return (Class<B>)extractClassFromType(actualArg);}

這將在許多實(shí)際情況下起作用,但并非總是如此??紤]:

public class Foo<U,T extends Collection<?>> extends A<T> {}(new Foo<String,List<Object>>() {}).g();

這將拋出一個(gè)ClassCastException,因?yàn)榇颂幍念愋蛥?shù)不是Class或者是ParameterizedType一點(diǎn)也不,這是TypeVariable T..所以現(xiàn)在你會(huì)被困在想找出哪種類型T應(yīng)該是用來(lái)代表兔子洞的,以此類推。

我認(rèn)為唯一合理的、一般的答案是類似于Nicolas最初的答案-一般來(lái)說(shuō),如果您的類需要實(shí)例化編譯時(shí)未知的其他類的對(duì)象,那么類的用戶需要顯式地將該類文字(或者可能是一個(gè)工廠)傳遞給您的類,而不僅僅是依賴泛型。


查看完整回答
反對(duì) 回復(fù) 2019-07-17
  • 3 回答
  • 0 關(guān)注
  • 1002 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)