স্থির জেনেরিক পদ্ধতি কলিং


106

আমি স্থির জেনেরিক পদ্ধতিতে জড়িত একটি কৌতূহলী পরিস্থিতি পেয়েছি। এই কোড:

class Foo<E>
{
    public static <E> Foo<E> createFoo()
    {
        // ...
    }
}

class Bar<E>
{
    private Foo<E> member;

    public Bar()
    {
        member = Foo.createFoo();
    }
}

কীভাবে আসব আমাকে এক্সপ্রেশনটিতে কোনও ধরণের আর্গুমেন্ট নির্দিষ্ট করতে হবে না Foo.createFoo()? এটি কি কোনও ধরণের অনুমান? আমি যদি এ সম্পর্কে সুস্পষ্ট হতে চাই তবে আমি কীভাবে প্রকারের যুক্তিটি নির্দিষ্ট করতে পারি?


7
আমি আপনাকে createFoo পদ্ধতিতে টাইপ পরামিতি ই পরিবর্তন করার পরামর্শ দিচ্ছি। কারণ, ক্লাস ফু এর টাইপ প্যারামিটার ই পদ্ধতি ক্রিয়েফু () এর টাইপ প্যারামিটার ই থেকে আলাদা।
গুরসেল কোকা

@ গুরু্সেলকোকা তিনি স্পষ্টভাবে সদস্য = ফু করতে পারেন <<E> createFoo (); তাদের সংকলন সময় হিসাবে একই হতে হবে।
জর্জ জাভিয়ার

উত্তর:


183

হ্যাঁ, এটি জেএলএস বিভাগ 15.12.2.8 অনুযায়ী অ্যাসাইনমেন্টের টার্গেটের উপর ভিত্তি করে এই টাইপ অনুক্রম । স্পষ্টতই, আপনি কিছু কল করতে চাই:

Foo.<String>createFoo();

3
বা, যেমনটি আমার ক্ষেত্রে রয়েছে: Foo.<E>createFoo();আপনাকে ধন্যবাদ :)
ফ্রেডওভারফ্লো

7
এই কাজটি এসাইনমেন্ট ছাড়া কীভাবে কাজ করে? যে, বিবৃতি Foo.createFoo(); ঠিক ঠিক সংকলন ...? এটি কি ক্ষয় টাইপ করার কারণে?
ফ্রেডওভারফ্লো

9
@ এসিডেন্ট ব্যতীত ফ্রেড ওভারফ্লো E"অনুমান" Object
হ'ল

2
নতুন লিঙ্কের অবস্থানটি সম্ভবত হ'ল
জোয়ানিস

3
প্রকারটি নির্দিষ্ট করার একটি ভিন্ন উপায় হ'ল ধরণের যুক্তি (যেমন এটি হবে ) Eসংজ্ঞায়িত করা হবে এবং এটিকে কল করুনcreateFoo()Class<E>createFoo(Class<E> type)createFoo(String.class)
গ্যাভিন এস ইয়্যানসি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.