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

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

在 Java 中使用反射來設(shè)置方法的參數(shù)

在 Java 中使用反射來設(shè)置方法的參數(shù)

慕仙森 2022-10-26 17:19:20
我正在嘗試實(shí)現(xiàn)近似于以下內(nèi)容:public class MyClass<E>{    protected MyClass(Object[] variables)    {        //init    }    public MyClass(Comparator<? super E> comp, Object[] variables)    {        //init    }    public static <K extends Comparable<? super K>, T extends MyClass<K>>          T construct(T example, Object[] variables)    {        return new T(variables);    }}Object[] 變量不是實(shí)際代碼,而是構(gòu)造的實(shí)際參數(shù)的占位符。我的問題就在于此。我已經(jīng)看到很多例子,無論有沒有反射,當(dāng) T 的構(gòu)造函數(shù)的參數(shù)提前知道時(shí)如何做到這一點(diǎn),因此可以在構(gòu)造的參數(shù)中指定。但是,即使 T 的構(gòu)造函數(shù)的參數(shù)未知,我也希望能夠做到這一點(diǎn)。有沒有辦法做到這一點(diǎn)?我并不特別關(guān)心解決方案是否使用反射,只要它有效,但反射似乎是最有可能的選擇。作為一個(gè)整體,我對反思相當(dāng)陌生,所以如果這個(gè)問題相當(dāng)基本,我深表歉意。編輯:由于反饋無法動(dòng)態(tài)設(shè)置construct()我想稍微改變問題的參數(shù)。假設(shè)受保護(hù)的構(gòu)造函數(shù)具有類構(gòu)造所需的參數(shù),如果我使用vararg (public static <K extends Comparable<? super K>, T extends MyClass<K>>              T construct(T example, Object... variables))確保傳遞給變量的參數(shù)與構(gòu)造函數(shù)所需的參數(shù)匹配的最佳方法是什么?我曾希望動(dòng)態(tài)地執(zhí)行此操作,因?yàn)榫幾g器本身會(huì)防止此類問題,但如果沒有這種可能性,我要求最好的替代解決方案。編輯:為澄清起見,這是我的實(shí)際目標(biāo):我希望 MyClass 接受擴(kuò)展 Comparable 的參數(shù)化E或任何參數(shù)化,但傳入一個(gè) Comparator。我可以簡單地通過構(gòu)造函數(shù)實(shí)現(xiàn)第二個(gè)目標(biāo),但是為了讓 E 在第二種情況下對任何選項(xiàng)開放,我必須將它對任何選項(xiàng)開放。為了解決這個(gè)問題,我對通用構(gòu)造函數(shù)進(jìn)行了保護(hù),并創(chuàng)建了一個(gè)公共靜態(tài)方法來強(qiáng)制 Comparable 實(shí)現(xiàn)并充當(dāng)偽構(gòu)造函數(shù),返回類型為 MyClass,其中 K 是 Comparable。但是,當(dāng)另一個(gè)類擴(kuò)展 MyClass 時(shí),這會(huì)導(dǎo)致問題。如果我事先知道繼承類將具有與 MyClass 相同的參數(shù),那么我可以簡單地隱藏該方法并相應(yīng)地更改返回類型。但是如果我想讓子類有不同的參數(shù),那么我已經(jīng)改變了方法的簽名,不能再用它來隱藏前一個(gè),這意味著子類不僅可以返回自己的實(shí)例,還可以返回其父類的完全不同的實(shí)例。這是我想盡量避免的。
查看完整描述

3 回答

?
搖曳的薔薇

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

我認(rèn)為你不需要進(jìn)行反思。您只需要簡化您的需求并使用 java 和泛型的強(qiáng)大功能來滿足您的需求。這是根據(jù)您的第三次編輯的示例:


class MyClass<E> {

    private Comparator<MyClass<E>> comparator;


    public MyClass(List<Object> params, Comparator<MyClass<E>> comparator) {

        //init

        this.comparator = comparator;

    }


}

class  MyClassExtension extends MyClass<Integer> {


    public MyClassExtension(List<Object> params, Comparator<MyClass<java.lang.Integer>> comparator) {

        super(params, comparator);

    }

}

class  MyClassExtension2<E> extends MyClass<E> {


    public MyClassExtension2(List<Object> params, Comparator<MyClass<E>> comparator) {

        super(params, comparator);

    }

}


查看完整回答
反對 回復(fù) 2022-10-26
?
拉風(fēng)的咖菲貓

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

我想我自己可能已經(jīng)意識(shí)到了一個(gè)潛在的解決方案,盡管我希望得到關(guān)于它的可行性的反饋。


public class MyClass<E>

{

    public MyClass(Comparable<? super E> example, E example2, Object[] variables) 

      throws IllegalArgumentException

    {

        if(!example.getClass().equals(example2.getClass())

        {

             throw new IllegalArgumentException();

        }

        //init

    }


    public MyClass(Comparator<? super E> comp, Object[] variables)

    {

        //init

    }

}

這個(gè)想法是 if 語句強(qiáng)制example成為與泛型 E 相同的類,并且example作為參數(shù)的存在強(qiáng)制該類實(shí)現(xiàn) Comparable。


查看完整回答
反對 回復(fù) 2022-10-26
?
ibeautiful

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

這可能有效,但我不建議這樣做。請注意,要使其正常工作,必須不是example所有成員variablesnull


public static <K extends Comparable<? super K>, T extends MyClass<K>> 

     T construct(T example, Object[] variables) throws 

                 NoSuchMethodException,

                 SecurityException,

                 InstantiationException,

                 IllegalAccessException,

                 IllegalArgumentException,

                 InvocationTargetException 

{

    Objects.requireNotNull(example);


    Class<?>[] argTypes = new Class<?>[variables.length];

    for ( int i = 0; i < variables.length; ++i)

    {

        // This will NPE if variables[i] is null

        argTypes[i] = variables[i].getClass();

    }


    // This will throw, if constructor is not defined

    Constructor<?> constructor = example.getClass().getConstructor(argTypes);


    return (T) constructor.newInstance(variables);

}

通常,您正在做的事情可以通過創(chuàng)建一個(gè)創(chuàng)建特定類實(shí)例的工廠接口來實(shí)現(xiàn)。


查看完整回答
反對 回復(fù) 2022-10-26
  • 3 回答
  • 0 關(guān)注
  • 195 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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