জাভাতে জেনেরিক অ্যারে কীভাবে তৈরি করবেন?


1089

জাভা জেনেরিকগুলি প্রয়োগের কারণে আপনার এই জাতীয় কোড থাকতে পারে না:

public class GenSet<E> {
    private E a[];

    public GenSet() {
        a = new E[INITIAL_ARRAY_LENGTH]; // error: generic array creation
    }
}

প্রকার সুরক্ষা বজায় রেখে আমি কীভাবে এটি বাস্তবায়ন করতে পারি?

আমি জাভা ফোরামে একটি সমাধান দেখেছি যা এরকম হয়:

import java.lang.reflect.Array;

class Stack<T> {
    public Stack(Class<T> clazz, int capacity) {
        array = (T[])Array.newInstance(clazz, capacity);
    }

    private final T[] array;
}

কিন্তু সত্যিই আমি যা করছি তা পাই না।


14
আপনার এখানে সত্যই কোন অ্যারে ব্যবহার করা দরকার ? একটি সংগ্রহ ব্যবহার সম্পর্কে কী?
ম্যাট বি বি

12
হ্যাঁ আমি আরও মনে করি যে সংগ্রহগুলি এই সমস্যার জন্য আরও মার্জিত। তবে এটি একটি শ্রেণীর দায়িত্বের জন্য এবং তাদের প্রয়োজনীয় :(
তাতসুহিরোসাতো

3
আমি বুঝতে পারছি না কেন এখানে আমার প্রতিবিম্ব প্রয়োজন ava জাভা ব্যাকরণটি অদ্ভুত: নতুন জাভা.উটিল.হ্যাশম্যাপ <স্ট্রিং, স্ট্রিং> [10] এর জন্য বৈধ নয়। নতুন java.util.HashMap <দীর্ঘ, দীর্ঘ> (10) বৈধ নয়। নতুন দীর্ঘ [] [10] বৈধ নয়, নতুন দীর্ঘ [10] [] বৈধ। এই স্টাফটি এমন একটি প্রোগ্রাম লিখুন যা জাভা প্রোগ্রাম লিখতে পারে আরও কঠিন তবে এটির মতো মনে হয়।
ব্রোঞ্জের মানুষ

উত্তর:


702

বিনিময়ে আমাকে একটি প্রশ্ন জিজ্ঞাসা করতে হবে: আপনার GenSet"পরীক্ষিত" বা "চেক না করা"? ওটার মানে কি?

  • চেক করা হয়েছে : শক্তিশালী টাইপিংGenSetএটি কী ধরণের পদার্থ ধারণ করে তা স্পষ্টভাবে জানে (অর্থাত্ এটির নির্মাতাকে স্পষ্টভাবে একটি Class<E>যুক্তি দিয়ে ডাকা হত , এবং পদ্ধতিগুলি যখন ব্যতিক্রম নয় তত যুক্তিগুলি পাস করার পরে একটি ব্যতিক্রম ছুঁড়ে ফেলবে ESee দেখুন Collections.checkedCollection

    -> সেক্ষেত্রে আপনার লেখা উচিত:

    public class GenSet<E> {
    
        private E[] a;
    
        public GenSet(Class<E> c, int s) {
            // Use Array native method to create array
            // of a type only known at run time
            @SuppressWarnings("unchecked")
            final E[] a = (E[]) Array.newInstance(c, s);
            this.a = a;
        }
    
        E get(int i) {
            return a[i];
        }
    }
  • যাচাই করা হয়নি : দুর্বল টাইপিং । আর্গুমেন্ট হিসাবে পাস করা যে কোনও বস্তুর উপরে আসলে কোনও ধরণের চেকিং করা হয় না।

    -> সেক্ষেত্রে আপনার লেখা উচিত

    public class GenSet<E> {
    
        private Object[] a;
    
        public GenSet(int s) {
            a = new Object[s];
        }
    
        E get(int i) {
            @SuppressWarnings("unchecked")
            final E e = (E) a[i];
            return e;
        }
    }

    নোট করুন যে অ্যারের উপাদান টাইপ প্যারামিটারের ক্ষয় হতে হবে :

    public class GenSet<E extends Foo> { // E has an upper bound of Foo
    
        private Foo[] a; // E erases to Foo, so use Foo[]
    
        public GenSet(int s) {
            a = new Foo[s];
        }
    
        ...
    }

জাভাতে জেনেরিকগুলির জ্ঞাত এবং ইচ্ছাকৃত দুর্বলতা থেকে এই সমস্ত ফলাফল: এটি ক্ষয় ব্যবস্থার সাহায্যে প্রয়োগ করা হয়েছিল, সুতরাং "জেনেরিক" শ্রেণিগুলি জানে না যে তারা রান টাইমে কোন ধরণের যুক্তি দিয়ে তৈরি হয়েছিল, এবং তাই টাইপ- সরবরাহ করতে পারে না কিছু স্পষ্ট প্রক্রিয়া (টাইপ-চেকিং) প্রয়োগ না করা পর্যন্ত সুরক্ষা।


7
পারফরম্যান্স-ভিত্তিতে সেরা বিকল্পটি কী হবে? আমার এই অ্যারে থেকে প্রায়শই উপাদানগুলি পাওয়া দরকার (একটি লুপের মধ্যে)। সুতরাং একটি সংগ্রহ সম্ভবত ধীর, কিন্তু এই দুটি মধ্যে কোনটি দ্রুত?
ব্যবহারকারী 1111929

3
এবং জেনেরিক টাইপটি সীমাবদ্ধ থাকলে, ব্যাকিং অ্যারেটি বাউন্ডিং টাইপের হওয়া উচিত।
মর্দচাই

5
@ অ্যারোনডিগুল্লা কেবল এটি স্পষ্ট করে বলছেন যে এটি নির্ধারিত নয়, তবে স্থানীয় ভেরিয়েবলের সূচনা initial আপনি একটি অভিব্যক্তি / বিবৃতি টিকা দিতে পারবেন না।
কেনেটিএম

1
@ ভারখান এই শ্রেণীর প্রয়োগের মধ্য থেকেই এই অ্যারেগুলি পুনরায় আকার দেওয়ার কোনও উপায় আছে? উদাহরণস্বরূপ যদি আমি অ্যারেলিস্টের মতো ওভারফ্লোর পরে আকার পরিবর্তন করতে চাই। Object[] EMPTY_ELEMENTDATA = {}স্টোরেজের জন্য তারা রয়েছে অ্যারেলিস্টের প্রয়োগ বাস্তবায়ন করেছি । জেনেরিকগুলি ব্যবহার করে ধরণটি না জেনে আকার পরিবর্তন করতে আমি কি এই প্রক্রিয়াটি ব্যবহার করতে পারি?
জার্নম্যান

2
যারা জেনেরিক ধরণের (যা আমি সন্ধান করছিলাম) দিয়ে একটি পদ্ধতি তৈরি করতে চান তাদের জন্য এটি ব্যবহার করুন:public void <T> T[] newArray(Class<T> type, int length) { ... }
ড্যানিয়েল কেভিস্ট

225

তুমি এটি করতে পারো:

E[] arr = (E[])new Object[INITIAL_ARRAY_LENGTH];

কার্যকর জাভাতে জেনেরিক সংগ্রহ বাস্তবায়নের অন্যতম প্রস্তাবিত উপায় ; আইটেম 26 । কোনও ধরণের ত্রুটি নেই, বারবার অ্যারে কাস্ট করার দরকার নেই। তবে এটি একটি সতর্কতা ট্রিগার করে কারণ এটি সম্ভাব্য বিপজ্জনক, এবং সতর্কতার সাথে ব্যবহার করা উচিত। মন্তব্যে বিশদ হিসাবে, Object[]এটি এখন আমাদের E[]ধরণের হিসাবে মুখোশ তৈরি হচ্ছে এবং অপ্রত্যাশিত ত্রুটি বা কারণ হতে পারেClassCastException যদি অনিরাপদভাবে ব্যবহার করা হয় তবে গুলি ।

থাম্বের নিয়ম হিসাবে, যতক্ষণ না castালাই অ্যারে অভ্যন্তরীণভাবে ব্যবহৃত হয় (যেমন কোনও ডেটা স্ট্রাকচারের ব্যাক করতে), এবং ক্লায়েন্ট কোডে ফিরে আসে না বা প্রকাশ না করা হয় ততক্ষণ এই আচরণটি নিরাপদ। আপনার যদি অন্য কোডটিতে জেনেরিক ধরণের একটি অ্যারে ফিরিয়ে দেওয়ার দরকার হয় তবে আপনি যে প্রতিবিম্ব Arrayশ্রেণীর উল্লেখ করেছেন সেটি হ'ল সঠিক উপায়।


উল্লেখ করার মতো যে যেখানেই সম্ভব, আপনি Listজেনেরিক ব্যবহার করছেন যদি অ্যারের চেয়ে আর এর সাথে কাজ করার জন্য আপনার অনেক বেশি সুখী সময় হবে । অবশ্যই কখনও কখনও আপনার পছন্দ হয় না, তবে সংগ্রহ কাঠামো ব্যবহার করা আরও বেশি শক্তিশালী।


47
String[] s=b;উপরের test()পদ্ধতিতে যেমন অ্যারেটিকে কোনও ধরণের টাইপযুক্ত অ্যারে হিসাবে বিবেচনা করা হয় তবে এটি কাজ করবে না । এর কারণ E এর অ্যারেটি আসলে নয়, এটি অবজেক্ট []। আপনি যদি এটি চান তবে এটি গুরুত্বপূর্ণ, যেমন List<String>[]- আপনি এটির Object[]জন্য কোনও ব্যবহার করতে পারবেন না , আপনার অবশ্যই একটি List[]বিশেষভাবে থাকতে হবে। কোন কারণেই আপনার প্রতিবিম্বিত শ্রেণি <?> অ্যারে তৈরি ব্যবহার করা দরকার।
লরেন্স ডল

8
কর্নার-কেস / সমস্যাটি হ'ল যদি আপনি করতে চান, উদাহরণস্বরূপ, public E[] toArray() { return (E[])internalArray.clone(); }কখন internalArrayটাইপ করা হয় E[]এবং তাই এটি আসলে একটি Object[]। এটি টাইপ-কাস্ট ব্যতিক্রমের সাথে রানটাইমে ব্যর্থ হয় কারণ Object[]প্রকার যা Eঘটে তা তার একটি অ্যারেতে বরাদ্দ করা যায় না।
লরেন্স ডল

17
মূলত, আপনি যতক্ষণ অ্যারে না ফেরান বা পাস না করেন বা ক্লাসের বাইরের কোনও জায়গায় নির্দিষ্ট ধরণের অ্যারের প্রয়োজন হয় তা সংরক্ষণ না করা পর্যন্ত এই পদ্ধতিটি কাজ করবে। আপনি ক্লাসের মধ্যে রয়েছেন যতক্ষণ না আপনি ভাল আছেন কারণ ই মুছে যায়। এটি "বিপজ্জনক" কারণ আপনি যদি এটি বা অন্য কোনও কিছু ফিরিয়ে দেওয়ার চেষ্টা করেন তবে আপনি কোনওরকম সতর্কতা পাবেন না যে এটি অনিরাপদ। আপনি যদি যত্নবান হন তবে তা কার্যকর হয়।
newacct

3
এটি বেশ নিরাপদ। ইন E[] b = (E[])new Object[1];তোমরা স্পষ্টই দেখতে পাচ্ছো নির্মিত অ্যারেতে শুধুমাত্র রেফারেন্সের যে bএবং যে ধরনের bহয় E[]। অতএব দুর্ঘটনাক্রমে ভিন্ন ধরণের বিভিন্ন ভেরিয়েবলের মাধ্যমে একই অ্যারে অ্যাক্সেস করার আপনার কোনও বিপদ নেই। যদি এর পরিবর্তে, আপনার Object[] a = new Object[1]; E[]b = (E[])a; তখন কীভাবে আপনি ব্যবহার করবেন সে সম্পর্কে আপনাকে ভৌতিক হতে হবে a
অ্যারন ম্যাকডেইড

5
অন্তত জাভা ১.6 এ, এটি একটি সতর্কতা উত্পন্ন করে: "অবজেক্ট [] থেকে টি []
অবধি চেক করা কাস্টম

61

সুরক্ষা সংরক্ষণের সময় আপনি যে ধরণের সন্ধান করছেন ঠিক তার ধরণের অ্যারে পেতে জেনেরিকগুলি কীভাবে ব্যবহার করবেন তা এখানে রয়েছে (অন্য উত্তরের বিপরীতে, যা আপনাকে Objectসংকলনের সময় একটি অ্যারে ফিরিয়ে দেবে বা পরিণতিতে সতর্কবার্তার ফলস্বরূপ):

import java.lang.reflect.Array;  

public class GenSet<E> {  
    private E[] a;  

    public GenSet(Class<E[]> clazz, int length) {  
        a = clazz.cast(Array.newInstance(clazz.getComponentType(), length));  
    }  

    public static void main(String[] args) {  
        GenSet<String> foo = new GenSet<String>(String[].class, 1);  
        String[] bar = foo.a;  
        foo.a[0] = "xyzzy";  
        String baz = foo.a[0];  
    }  
}

এটি কোনও সতর্কতা ছাড়াই সংকলন করে এবং আপনি যেমন দেখতে পাচ্ছেন main, যে কোনও ধরণের জন্য আপনি GenSetযেমন উদাহরণ হিসাবে ঘোষণা করেন, আপনি aসেই ধরণের অ্যারেতে নির্ধারণ করতে পারেন এবং আপনি কোনও উপাদান নির্ধারণ করতে পারেনa সেই ধরণের একটি ভেরিয়েবলের , যার অর্থ অ্যারে এবং অ্যারের মানগুলি সঠিক ধরণের হয়।

এটি জাভা টিউটোরিয়ালে আলোচিত যেমন রানটাইম টাইপ টোকেন হিসাবে শ্রেণীর লিটারালগুলি ব্যবহার করে কাজ করে । ক্লাস লিটারালগুলির উদাহরণ হিসাবে সংকলক দ্বারা চিকিত্সা করা হয় java.lang.Class। একটি ব্যবহার করতে, সহ একটি শ্রেণীর নামটি অনুসরণ করুন .class। সুতরাং, শ্রেণীর প্রতিনিধিত্বকারী String.classএকটি Classউপাদান হিসাবে কাজ করে String। এই ইন্টারফেস, enums কোন-মাত্রিক অ্যারে (যেমন জন্য কাজ করে String[].class), প্রিমিটিভের (যেমন int.class), এবং শব্দ void(যেমনvoid.class ) ।

Class(হিসাবে ঘোষণা নিজেই জেনেরিক হয় Class<T>, যেখানে Tযে ধরনের ঘোরা Classবস্তু প্রতিনিধিত্বমূলক হয়), যার মানে হল ধরণ String.classহলClass<String>

সুতরাং, যখনই আপনার জন্য কন্সট্রাকটর কল GenSet, আপনাকে প্রথমে যুক্তি একটি অ্যারের প্রতিনিধিত্বমূলক জন্য একটি শ্রেণী আক্ষরিক মধ্যে পাস GenSetউদাহরণস্বরূপ এর ঘোষিত টাইপ (যেমন String[].classজন্য GenSet<String>)। নোট করুন যে আপনি আদিমগুলির একটি অ্যারে পেতে সক্ষম হবেন না, যেহেতু আদিমগুলি প্রকারের ভেরিয়েবলের জন্য ব্যবহার করা যায় না।

কনস্ট্রাক্টরের অভ্যন্তরে, পদ্ধতিকে কল করে সেই পদ্ধতিটি কল করা বস্তুর দ্বারা প্রতিনিধিত্ব করা শ্রেণিতে castপাস হওয়া Objectআর্গুমেন্টটি ফেরত দেয় Class। স্ট্যাটিক পদ্ধতি কলিং newInstanceমধ্যে java.lang.reflect.Arrayএকটি হিসাবে আয় Objectটাইপ দ্বারা উপস্থাপিত একটি অ্যারের Classবস্তু প্রথম আর্গুমেন্ট হিসাবে এবং দৈর্ঘ্য দ্বারা নির্দিষ্ট যা অতীত হয়ে intদ্বিতীয় আর্গুমেন্ট হিসাবে গৃহীত। পদ্ধতি কলিং getComponentTypeরিটার্ন একটি Classবস্তুর অ্যারের দ্বারা উপস্থাপিত উপাদান টাইপ প্রতিনিধিত্বমূলক Classবস্তুর উপর পদ্ধতি বলা হয় (যেমন String.classজন্য String[].class, nullযদিClass বস্তুর একটি অ্যারে প্রতিনিধিত্ব করে না)।

এই শেষ বাক্যটি সম্পূর্ণ সঠিক নয়। কলিং ক্লাসের প্রতিনিধিত্ব করে এমন String[].class.getComponentType()একটি Classবস্তু ফেরত দেয় Stringতবে এর ধরণটি Class<?>নয় Class<String>, তাই আপনি নীচের মতো কিছু করতে পারবেন না।

String foo = String[].class.getComponentType().cast("bar"); // won't compile

একইভাবে প্রতিটি পদ্ধতির জন্য যায় Classযা কোনও Classবস্তু দেয়।

এই উত্তরে জোয়াকিম সউরের মন্তব্য সম্পর্কে (নিজেই এ সম্পর্কে মন্তব্য করার মতো যথেষ্ট খ্যাতি আমার নেই), কাস্ট ব্যবহারের উদাহরণটি T[]একটি সতর্কবার্তা হিসাবে দেখাবে কারণ সংকলক সেই ক্ষেত্রে প্রকারের সুরক্ষার গ্যারান্টি দিতে পারে না।


ইনোগোর মন্তব্য সম্পর্কিত সম্পাদনা করুন:

public static <T> T[] newArray(Class<T[]> type, int size) {
   return type.cast(Array.newInstance(type.getComponentType(), size));
}

5
এটি অকেজো, এটি কেবল নতুন স্ট্রিং লেখার জটিল উপায় [...]। তবে আসলে যা দরকার তা হ'ল পাবলিক স্ট্যাটিকের মতো কিছু <T> টি [] নতুন অ্যারে (ইনট আকার) {...}, এবং এটি জাভা নয়েরে কেবল উপস্থিত নেই এটি প্রতিবিম্বের সাথে সিমুলেটেড করা যায় - কারণটি হ'ল কীভাবে সম্পর্কিত তথ্য একটি জেনেরিক টাইপ ইনস্ট্যান্ট হয় রানটাইম উপলভ্য নয়।
ইনগো

4
@ ইঙ্গো আপনি কী সম্পর্কে কথা বলছেন? আমার কোডটি যে কোনও ধরণের অ্যারে তৈরি করতে ব্যবহার করা যেতে পারে।
gdejohn

3
@ চার্লাতান: অবশ্যই, তবে নতুনভাবেও [] পারা যায়। প্রশ্নটি: কার প্রকার এবং কখন জানে। সুতরাং, আপনার সমস্ত কিছু যদি জেনেরিক ধরণের হয় তবে আপনি পারবেন না।
ইনগো

2
আমি সন্দেহ করি না।
ইনগো

2
প্রায়। আমি স্বীকার করি যে এটি নতুন [] এর মাধ্যমে অর্জন করা যায় তার চেয়ে বেশি। অনুশীলনে, এটি প্রায় সবসময় কাজটি করবে। তবে এটি এখনও সম্ভব নয়, উদাহরণস্বরূপ, E এর সাথে প্যারামিটারাইজ করা একটি ধারক শ্রেণীর লেখার জন্য যে পদ্ধতি E [] টু অ্যারে () রয়েছে এবং এটি সত্যই সত্যিকারের E [] অ্যারে দেয় write আপনার কোডটি তখনই প্রয়োগ করা যেতে পারে যখন সংগ্রহে কমপক্ষে একটি ই-অবজেক্ট থাকে। সুতরাং, একটি সাধারণ সমাধান অসম্ভব।
ইনগো

42

এটি একমাত্র উত্তর যা টাইপ নিরাপদ

E[] a;

a = newArray(size);

@SafeVarargs
static <E> E[] newArray(int length, E... array)
{
    return Arrays.copyOf(array, length);
}

আমাকে এটি সন্ধান করতে হবে, তবে হ্যাঁ, দ্বিতীয় "দৈর্ঘ্য" যুক্তিটি Arrays#copyOf()প্রথম আর্গুমেন্ট হিসাবে সরবরাহ করা অ্যারের দৈর্ঘ্যের তুলনায় স্বতন্ত্র। অর্থাৎ চালাক যদিও এটি কল খরচ পরিশোধ করে Math#min()এবং System#arrayCopy(), তন্ন তন্ন যার কঠোরভাবে এই কাজ শেষ করার জন্য প্রয়োজন। docs.oracle.com/javase/7/docs/api/java/util/...
Seh

8
Eটাইপ ভেরিয়েবল হলে এটি কাজ করে না । ভ্যারাগস Eকখন Eকোনও ধরণের ভেরিয়েবলের মুছে ফেলার একটি অ্যারে তৈরি করে যা এটিকে থেকে আলাদা করে না (E[])new Object[n]। দয়া করে http://ideone.com/T8xF91 দেখুন । এটা কোন মানে অন্য কোন উত্তর চেয়ে বেশি টাইপ নিরাপদ।
রেডিওডেফ

1
@ রেডিওডেফ - সংকলনের সময় সমাধানটি প্রকারে নিরাপদ। নোট করুন যে মুছে ফেলা ভাষা অনুচ্ছেদের ঠিক অঙ্গ নয়; স্পেকটি সাবধানে লেখা হয়েছে যাতে ভবিষ্যতে আমাদের সম্পূর্ণ পুনর্গঠন হতে পারে - এবং তারপরে এই সমাধানটি অন্যান্য সমাধানগুলির বিপরীতে রানটাইমের সময়ও পুরোপুরি কাজ করবে।
ঝং ইয়ু

@ রেডিওডেফ - জেনেরিক অ্যারে তৈরি নিষিদ্ধ করা ভাল ধারণা কিনা তা বিতর্কযোগ্য। নির্বিশেষে, ভাষা একটি দোরগোড়া ছেড়ে দেয় - ভারার্গের জন্য জেনেরিক অ্যারে তৈরির প্রয়োজন হয়। ভাষাটি যেমন অনুমতি দিয়েছে ঠিক তেমনি ভাল new E[]। আপনার উদাহরণটিতে যে সমস্যাটি আপনি দেখিয়েছেন তা হ'ল একটি সাধারণ ক্ষয় সমস্যা, এই প্রশ্ন এবং এই উত্তরের সাথে অনন্য নয়।
ঝোংইউ

2
@ রেডিওডেফ - কিছু পার্থক্য রয়েছে। এই সমাধানটির নির্ভুলতা সংকলক দ্বারা পরীক্ষা করা হয়; এটি জোর করে নিক্ষেপের মানবিক যুক্তির উপর নির্ভর করে না। এই বিশেষ সমস্যার জন্য পার্থক্যটি উল্লেখযোগ্য নয়। কিছু লোক কেবল একটু অভিনব হতে চান, এগুলিই। যদি ওপির কথার মাধ্যমে যদি কেউ বিভ্রান্ত হয় তবে তা আপনার মন্তব্য এবং আমার দ্বারা পরিষ্কার করা হয়েছে।
ঝং ইয়ু

33

আরও মাত্রা প্রসারিত করতে, কেবলমাত্র []এর এবং মাত্রা পরামিতিগুলি যুক্ত করুন newInstance()( Tএটি একটি ধরণের প্যারামিটার, clsএটি একটি Class<T>, এর d1মাধ্যমে d5পূর্ণসংখ্যা হয়):

T[] array = (T[])Array.newInstance(cls, d1);
T[][] array = (T[][])Array.newInstance(cls, d1, d2);
T[][][] array = (T[][][])Array.newInstance(cls, d1, d2, d3);
T[][][][] array = (T[][][][])Array.newInstance(cls, d1, d2, d3, d4);
T[][][][][] array = (T[][][][][])Array.newInstance(cls, d1, d2, d3, d4, d5);

দেখুন Array.newInstance()বিস্তারিত জানার জন্য।


4
+1 বহু-মাত্রিক অ্যারে তৈরি সম্পর্কে এমন প্রশ্ন রয়েছে যা এই পোস্টের দ্বৈত হিসাবে বন্ধ হয়ে যায় - তবে কোনও উত্তর বিশেষভাবে এটিকে সম্বোধন করতে পারেনি।
পল বেলোরা

1
@ জর্ডানসি হয়তো; যদিও এটি স্টিওভারফ্লো . com/a/5671304/616460 এর মতো স্পিরিটে একই ; আমি আগামীকাল পরিচালনা করার সেরা উপায় সম্পর্কে চিন্তা করব। আমার ঘুম পাচ্ছে.
জেসন সি

14

জাভা 8-এ, আমরা ল্যাম্বদা বা পদ্ধতির রেফারেন্স ব্যবহার করে এক ধরণের জেনেরিক অ্যারে তৈরি করতে পারি। এটি প্রতিফলিত পদ্ধতির মতো (যা একটি পাস করে Class) এর মতো, তবে এখানে আমরা প্রতিবিম্বটি ব্যবহার করছি না।

@FunctionalInterface
interface ArraySupplier<E> {
    E[] get(int length);
}

class GenericSet<E> {
    private final ArraySupplier<E> supplier;
    private E[] array;

    GenericSet(ArraySupplier<E> supplier) {
        this.supplier = supplier;
        this.array    = supplier.get(10);
    }

    public static void main(String[] args) {
        GenericSet<String> ofString =
            new GenericSet<>(String[]::new);
        GenericSet<Double> ofDouble =
            new GenericSet<>(Double[]::new);
    }
}

উদাহরণস্বরূপ, এটি দ্বারা ব্যবহৃত হয় <A> A[] Stream.toArray(IntFunction<A[]>)

এটি বেনামে ক্লাস ব্যবহার করে প্রি-জাভা 8 করা যেতে পারে তবে এটি আরও জটিল।


আপনার সত্যিকারের ArraySupplierজন্য এর জন্য বিশেষ ইন্টারফেসের দরকার নেই , আপনি নির্মাতাকে হিসাবে ঘোষণা করতে পারেন GenSet(Supplier<E[]> supplier) { ...এবং আপনার মতো একই লাইনের সাথে কল করতে পারেন।
Lii

4
@ লিআই আমার উদাহরণ হিসাবে একই হতে, এটি হবে IntFunction<E[]>, তবে হ্যাঁ এটি সত্য।
রেডিওডেফ

11

এটি কার্যকর জাভা, দ্বিতীয় সংস্করণ , আইটেম 25 এর অধ্যায় 5 (জেনারিক্স) এ আচ্ছাদিত রয়েছে ... অ্যারেগুলিতে তালিকা পছন্দ করুন

আপনার কোডটি কাজ করবে, যদিও এটি একটি চেক না করা সতর্কতা উত্পন্ন করবে (যা আপনি নিম্নলিখিত টীকা দিয়ে দমন করতে পারেন:

@SuppressWarnings({"unchecked"})

তবে অ্যারের পরিবর্তে একটি তালিকা ব্যবহার করা ভাল।

ওপেনজেডিকে প্রকল্প সাইটে এই বাগ / বৈশিষ্ট্যটির একটি আকর্ষণীয় আলোচনা রয়েছে ।


8

আপনার কনস্ট্রাক্টরের কাছে ক্লাস আর্গুমেন্ট পাস করার দরকার নেই। এটা চেষ্টা কর.

public class GenSet<T> {
    private final T[] array;
    @SuppressWarnings("unchecked")
    public GenSet(int capacity, T... dummy) {
        if (dummy.length > 0)
            throw new IllegalArgumentException(
              "Do not provide values for dummy argument.");
        Class<?> c = dummy.getClass().getComponentType();
        array = (T[])Array.newInstance(c, capacity);
    }
    @Override
    public String toString() {
        return "GenSet of " + array.getClass().getComponentType().getName()
            + "[" + array.length + "]";
    }
}

এবং

GenSet<Integer> intSet = new GenSet<>(3);
System.out.println(intSet);
System.out.println(new GenSet<String>(2));

ফলাফল:

GenSet of java.lang.Integer[3]
GenSet of java.lang.String[2]

7

জাভা জেনেরিকগুলি সংকলনের সময় প্রকারগুলি পরীক্ষা করে এবং উপযুক্ত ক্যাসেট সন্নিবেশ করিয়ে কাজ করে তবে মুছে ফেলা হয় সংকলিত ফাইলগুলিতে প্রকারগুলিএটি জেনেরিক লাইব্রেরিগুলিকে কোড দ্বারা ব্যবহারযোগ্য করে তোলে যা জেনেরিকগুলি বুঝতে পারে না (যা একটি ইচ্ছাকৃত নকশার সিদ্ধান্ত ছিল) তবে যার অর্থ আপনি সাধারণত রান টাইমে কী ধরনের তা খুঁজে পেতে পারেন না।

প্রকাশ্য Stack(Class<T> clazz,int capacity)কন্সট্রাকটর রান সময়ে একটি ক্লাস বস্তু, যার মানে ক্লাসের তথ্য পাস করতে হবে হয় কোড দরকার যে রানটাইম এ উপলব্ধ। এবংClass<T> ফর্মটির অর্থ হ'ল সংকলকটি পরীক্ষা করবে যে আপনি যে ক্লাস অবজেক্টটি পাস করেছেন তা হ'ল টি টাইপের টি জন্য ক্লাস অবজেক্ট, টি এর একটি সাবক্লাস নয়, টি এর একটি সুপারক্লাস নয়, তবে অবিকল টি।

এর অর্থ হ'ল আপনি আপনার কনস্ট্রাক্টরে উপযুক্ত টাইপের একটি অ্যারে অবজেক্ট তৈরি করতে পারবেন যার অর্থ আপনি আপনার সংগ্রহে যে ধরণের অবজেক্টগুলি সঞ্চয় করেন সেগুলির সংকলনটিতে যুক্ত হওয়ার সময় তাদের ধরণের পরীক্ষা করা হবে।


6

হাই যদিও থ্রেডটি মারা গেছে তবে আমি আপনার দৃষ্টি আকর্ষণ করতে চাই:

জেনেরিক্স সংকলনের সময় টাইপ পরীক্ষার জন্য ব্যবহৃত হয়:

  • সুতরাং উদ্দেশ্যটি যা যা আসে তা আপনার যা প্রয়োজন তা যাচাই করা।
  • আপনি ফিরে যাবেন তা ভোক্তার যা প্রয়োজন।
  • এটা যাচাই কর:

এখানে চিত্র বর্ণনা লিখুন

আপনি যখন জেনেরিক ক্লাস লিখছেন তখন টাইপকাস্টিং সতর্কতাগুলি নিয়ে চিন্তা করবেন না। আপনি এটি ব্যবহার করার সময় চিন্তিত হন।


6

এই সমাধান সম্পর্কে কি?

@SafeVarargs
public static <T> T[] toGenericArray(T ... elems) {
    return elems;
}

এটি কাজ করে এবং সত্য বলে মনে হয় খুব সহজ। কোন ত্রুটি আছে?


3
ঝরঝরে, তবে কেবলমাত্র যদি আপনি এটিকে 'ম্যানুয়ালি' বলে থাকেন তবে কাজ করে, অর্থাৎ উপাদানগুলি স্বতন্ত্রভাবে পাস করুন। যদি আপনি কোনও নতুন উদাহরণ তৈরি করতে না পারেন T[]তবে আপনি T[] elemsক্রিয়াকলাপে ফাংশনটি পাস করার জন্য কোনও তৈরি করতে পারবেন না । এবং যদি আপনি করতে পারেন, আপনার ফাংশনটির প্রয়োজন হবে না।
orlade

5

এই কোডটি দেখুন:

public static <T> T[] toArray(final List<T> obj) {
    if (obj == null || obj.isEmpty()) {
        return null;
    }
    final T t = obj.get(0);
    final T[] res = (T[]) Array.newInstance(t.getClass(), obj.size());
    for (int i = 0; i < obj.size(); i++) {
        res[i] = obj.get(i);
    }
    return res;
}

এটি কোনও ধরণের অবজেক্টের তালিকাকে একই ধরণের অ্যারেতে রূপান্তর করে।


হ্যাঁ, আপনি নাল ফিরে আসবেন, যা প্রত্যাশিত ফাঁকা অ্যারে নয়। এটি আপনি সবচেয়ে ভাল করতে পারেন তবে আদর্শ নয়।
কেভিন কক্স

Listএটিতে যদি ব্যর্থ হতে পারে তবে এর মধ্যে যদি একাধিক ধরণের অবজেক্ট থাকে যেমন toArray(Arrays.asList("abc", new Object()))নিক্ষেপ করে ArrayStoreException
রেডিওডেফ

আমি এর স্ট্রিপড ডাউন সংস্করণ ব্যবহার করেছি; প্রথমত আমি সেই কাজটি করতে সক্ষম হয়েছি, যদিও স্বীকার করেছি যে আমি এর সাথে জড়িত কিছু সমাধানের চেষ্টা করিনি। একটি forলুপ এবং অন্যান্যগুলি এড়াতে আমি Arrays.fill(res, obj);যেহেতু প্রতিটি সূচকের জন্য একই মান চেয়েছিলাম।
বারবার

5

আমি একটি দ্রুত এবং সহজ উপায় খুঁজে পেয়েছি যা আমার পক্ষে কাজ করে। নোট করুন যে আমি এটি কেবল জাভা জেডিকে ৮ তে ব্যবহার করেছি I আমি জানি না এটি পূর্ববর্তী সংস্করণগুলির সাথে কাজ করবে কিনা।

যদিও আমরা একটি নির্দিষ্ট ধরণের প্যারামিটারের জেনেরিক অ্যারে ইনস্ট্যান্ট করতে পারি না, আমরা জেনেরিক বর্গ নির্মাণকারীকে ইতিমধ্যে তৈরি অ্যারেটি পাস করতে পারি।

class GenArray <T> {
    private T theArray[]; // reference array

    // ...

    GenArray(T[] arr) {
        theArray = arr;
    }

    // Do whatever with the array...
}

এখন মূলত আমরা এর মতো অ্যারে তৈরি করতে পারি:

class GenArrayDemo {
    public static void main(String[] args) {
        int size = 10; // array size
        // Here we can instantiate the array of the type we want, say Character (no primitive types allowed in generics)
        Character[] ar = new Character[size];

        GenArray<Character> = new Character<>(ar); // create the generic Array

        // ...

    }
}

আপনার অ্যারেগুলির সাথে আরও নমনীয়তার জন্য আপনি একটি লিঙ্কযুক্ত তালিকা যেমন ব্যবহার করতে পারেন। জাভা.ইটিল.আরলিলিস্ট শ্রেণিতে আরেলিস্ট এবং অন্যান্য পদ্ধতিগুলি পাওয়া যায়।


4

উদাহরণস্বরূপ জাভা প্রতিবিম্বটি ব্যবহার করে একটি অ্যারে তৈরি করা। সাধারণত এটি করার পরামর্শ দেওয়া হয় না, কারণ এটি টাইপসেফ নয় fe পরিবর্তে, আপনার যা করা উচিত তা হ'ল কেবলমাত্র একটি অভ্যন্তরীণ তালিকা ব্যবহার করুন এবং অ্যারেটি একেবারেই এড়ানো উচিত।


13
দ্বিতীয় উদাহরণ (Array.newInstance ব্যবহার ()) হল সত্য typesafe হবে। এটি সম্ভব কারণ শ্রেণীর অবজেক্টের টাইপ টি টি অ্যারের টির সাথে মেলে প্রয়োজন। এটি মূলত আপনাকে সেই তথ্য সরবরাহ করতে বাধ্য করে যা জাভা রানটাইম জেনেরিকদের জন্য বাতিল করে দেয়।
জোছিম সউর


3

আমি এই কোডটি স্নিপেটকে একটি ক্লাস প্রতিবিম্বিতভাবে ইনস্ট্যান্ট করতে তৈরি করেছি যা একটি সাধারণ স্বয়ংক্রিয় পরীক্ষার ইউটিলিটির জন্য পাস করা হয়।

Object attributeValue = null;
try {
    if(clazz.isArray()){
        Class<?> arrayType = clazz.getComponentType();
        attributeValue = Array.newInstance(arrayType, 0);
    }
    else if(!clazz.isInterface()){
        attributeValue = BeanUtils.instantiateClass(clazz);
    }
} catch (Exception e) {
    logger.debug("Cannot instanciate \"{}\"", new Object[]{clazz});
}

এই বিভাগটি নোট করুন:

    if(clazz.isArray()){
        Class<?> arrayType = clazz.getComponentType();
        attributeValue = Array.newInstance(arrayType, 0);
    }

অ্যারে শুরু করার জন্য যেখানে অ্যারে.নিউইনস্ট্যান্স (অ্যারের শ্রেণি, অ্যারের আকার) । শ্রেণি আদিম (int.class) এবং অবজেক্ট (Integer.class) উভয়ই হতে পারে।

বিয়ান ইউটিসগুলি বসন্তের অংশ।


3

প্রকৃতপক্ষে এটি করার একটি সহজ উপায় হ'ল অবজেক্টগুলির একটি অ্যারে তৈরি করা এবং এটি নিম্নলিখিত উদাহরণের মতো আপনার পছন্দসই প্রকারে ফেলে দিন:

T[] array = (T[])new Object[SIZE];

যেখানে SIZEধ্রুবক এবং Tএটি একটি ধরণের শনাক্তকারী


1

অন্য ব্যক্তিদের দ্বারা প্রস্তাবিত জোর করা কাস্ট আমার পক্ষে কাজ করে না, অবৈধ castালাইয়ের ব্যতিক্রম ছুঁড়ে ফেলে।

তবে এই অন্তর্নির্মিত castালাই ভাল কাজ করেছে:

Item<K>[] array = new Item[SIZE];

আইটেমটি এমন একটি শ্রেণি যেখানে আমি সদস্যযুক্ত সংজ্ঞায়িত করেছি:

private K value;

এইভাবে আপনি কে টাইপের অ্যারে পাবেন (আইটেমটির যদি কেবলমাত্র মান থাকে) বা শ্রেণীর আইটেমটিতে আপনি যে কোনও জেনেরিক টাইপ সংজ্ঞায়িত করতে চান।


1

আপনি পোস্ট করেছেন এমন উদাহরণে আর কী চলছে সে প্রশ্নের উত্তর আর কেউ দেয়নি।

import java.lang.reflect.Array;

class Stack<T> {
    public Stack(Class<T> clazz, int capacity) {
        array = (T[])Array.newInstance(clazz, capacity);
    }

    private final T[] array;
}

অন্যরা যেমন বলেছে সংকলনের সময় জেনেরিকগুলি "মুছে ফেলা" হয়। সুতরাং রানটাইমের সময় জেনেরিকের একটি উদাহরণ তার উপাদান উপাদানটি কী তা তা জানে না। এর কারণটি historicalতিহাসিক, সান বিদ্যমান ইন্টারফেস (উত্স এবং বাইনারি উভয়) ভঙ্গ না করে জেনেরিক যুক্ত করতে চেয়েছিল।

অন্যদিকে অ্যারেগুলির Do রানটাইম তাদের উপাদান টাইপ জানি।

এই উদাহরণটি কোডটি নির্মাণ করে কনস্ট্রাক্টরকে (যা টাইপটি জানেন) ক্লাসটিকে প্রয়োজনীয় প্রকারটি বলে একটি পরামিতি পাস করে সমস্যাটি ঘিরে কাজ করে।

সুতরাং অ্যাপ্লিকেশনটি এমন কিছু দিয়ে ক্লাসটি তৈরি করবে

Stack<foo> = new Stack<foo>(foo.class,50)

এবং কনস্ট্রাক্টর এখন জেনে গেছে (রানটাইমের সময়) উপাদান উপাদানটি কী এবং সেই তথ্যটি প্রতিবিম্ব এপিআইয়ের মাধ্যমে অ্যারেটি নির্মাণ করতে ব্যবহার করতে পারে।

Array.newInstance(clazz, capacity);

পরিশেষে আমাদের কাছে টাইপ কাস্ট রয়েছে কারণ সংকলকটির জানার কোনও উপায় নেই যে ফিরে আসা অ্যারেটি Array#newInstance()সঠিক টাইপ (যদিও আমরা জানি)।

এই স্টাইলটি কিছুটা কুৎসিত তবে এটি কখনও কখনও জেনেরিক ধরণের তৈরির সবচেয়ে কম খারাপ সমাধান হতে পারে যা কোনও কারণেই (অ্যারে তৈরি করা বা তাদের উপাদানগুলির উদাহরণ তৈরি করা ইত্যাদি) জন্য রানটাইমগুলিতে তাদের উপাদান প্রকারের জানা দরকার।


1

আমি এই সমস্যার আশেপাশে একটি কাজ খুঁজে পেয়েছি।

নীচের লাইনটি জেনেরিক অ্যারে তৈরির ত্রুটি ছুড়ে ফেলেছে

List<Person>[] personLists=new ArrayList<Person>()[10];

তবে আমি List<Person>যদি একটি পৃথক শ্রেণিতে encapsulate করি , এটি কাজ করে।

import java.util.ArrayList;
import java.util.List;


public class PersonList {

    List<Person> people;

    public PersonList()
    {
        people=new ArrayList<Person>();
    }
}

আপনি জনগণের মাধ্যমে পার্সনলিস্ট শ্রেণিতে লোকদের প্রকাশ করতে পারেন। নীচের লাইনটি আপনাকে একটি অ্যারে দেবে, এতে List<Person>প্রতিটি উপাদান রয়েছে। অন্য কথায় অ্যারে List<Person>

PersonList[] personLists=new PersonList[10];

আমার যে কোডে আমি কাজ করছিলাম তার মধ্যে এই জাতীয় কিছু দরকার ছিল এবং এটি কাজ করতে এটিই আমি করেছি। এখনও পর্যন্ত কোনও সমস্যা নেই।


0

আপনি একটি অবজেক্ট অ্যারে তৈরি করতে এবং এটি সর্বত্র E তে কাস্ট করতে পারেন। হ্যাঁ, এটি করার খুব পরিষ্কার উপায় নয় তবে এটি কমপক্ষে কাজ করা উচিত।


"আমরা দীর্ঘ উত্তর খুঁজছি যা কিছু ব্যাখ্যা এবং প্রসঙ্গ সরবরাহ করে just কেবল একটি-লাইনের উত্তর দেবেন না; কেন আপনার উত্তরটি সঠিক, ব্যাখ্যাটি সহ আদর্শ হিসাবে ব্যাখ্যা করুন expla ব্যাখ্যা ছাড়াই উত্তরগুলি সরানো যেতে পারে।"
gparyani

তবে আপনার জেনেরিক শ্রেণি তুলনামূলক ইন্টারফেস বাস্তবায়ন করতে চায় এমন কিছু ক্ষেত্রে এটি কাজ করবে না।
রামপ্রসাদবিসিল

সাত বছর আগে স্বাগতম, আমি মনে করি।
এস্কো

1
আপনি জেনেরিক কোড থেকে অ জেনেরিক কলারে অ্যারে ফিরিয়ে দেওয়ার চেষ্টা করলে এটি কাজ করবে না। একটি হেড-স্কেটিং ক্লাসকাস্টেক্সসেপশন থাকবে।
প্লাগওয়াশ

0

এটা চেষ্টা কর.

private int m = 0;
private int n = 0;
private Element<T>[][] elements = null;

public MatrixData(int m, int n)
{
    this.m = m;
    this.n = n;

    this.elements = new Element[m][n];
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            this.elements[i][j] = new Element<T>();
        }
    }
}

আমি আপনার কোডটি চালাতে পারি না, আপনার Elementক্লাসটি কোথা থেকে আসে?

0

এটির পক্ষে একটি সহজ, তবুও অগোছালো কাজটি হ'ল আপনার মূল শ্রেণীর অভ্যন্তরে দ্বিতীয় "ধারক" শ্রেণীর বাসা বাঁধতে হবে এবং এটি আপনার ডেটা ধরে রাখতে ব্যবহার করবে।

public class Whatever<Thing>{
    private class Holder<OtherThing>{
        OtherThing thing;
    }
    public Holder<Thing>[] arrayOfHolders = new Holder<Thing>[10]
}

3
এটি আসলে কাজ করে না। new Holder<Thing>[10]জেনেরিক অ্যারে সৃষ্টি is
রেডিওডেফ

0

এই প্রশ্নের সাথে সম্পর্কিত নাও হতে পারে তবে আমি generic array creationব্যবহারের জন্য " " ত্রুটি পেয়েছি

Tuple<Long,String>[] tupleArray = new Tuple<Long,String>[10];

আমি নিম্নলিখিত রচনাগুলি (এবং আমার জন্য কাজ করেছেন) এর সাথে খুঁজে পাই @SuppressWarnings({"unchecked"}):

 Tuple<Long, String>[] tupleArray = new Tuple[10];

হ্যাঁ, এটি মোটামুটি সম্পর্কিত নয়, তবে একই ইস্যুগুলির (মুছে ফেলা, অ্যারে কোভেরিয়েন্স) মূল কারণ। : এখানে স্থিতিমাপ ধরনের অ্যারে তৈরি সম্পর্কে কোনো পোস্টের একটি উদাহরণ stackoverflow.com/questions/9542076/...
পল Bellora

0

আমি ভাবছি যদি এই কোডটি কার্যকর জেনেরিক অ্যারে তৈরি করে?

public T [] createArray(int desiredSize){
    ArrayList<T> builder = new ArrayList<T>();
    for(int x=0;x<desiredSize;x++){
        builder.add(null);
    }
    return builder.toArray(zeroArray());
}

//zeroArray should, in theory, create a zero-sized array of T
//when it is not given any parameters.

private T [] zeroArray(T... i){
    return i;
}

সম্পাদনা: সম্ভবত এই জাতীয় অ্যারে তৈরির একটি বিকল্প উপায়, আপনার প্রয়োজনীয় আকারটি যদি জানা থাকে এবং ছোট ছিল, তবে প্রয়োজনীয় শূন্যআর কমান্ডে "নাল" এর প্রয়োজনীয় সংখ্যাকে খাওয়াতে হবে?

যদিও স্পষ্টতই এটি ক্রিয়েআর কোড ব্যবহার করার মতো বহুমুখী নয়।


না, এটি কাজ করে না। ভ্যারাগগুলি Tকখন Tপ্রকারের পরিবর্তনশীল হয় তার ক্ষয় তৈরি করে , অর্থাৎ zeroArrayএকটি প্রদান করে Object[]Http://ideone.com/T8xF91 দেখুন ।
রেডিওডেফ

0

আপনি একটি কাস্ট ব্যবহার করতে পারেন:

public class GenSet<Item> {
    private Item[] a;

    public GenSet(int s) {
        a = (Item[]) new Object[s];
    }
}

আপনি যদি এটির পরামর্শ দিতে যাচ্ছেন তবে আপনাকে অবশ্যই এর সীমাবদ্ধতাগুলি ব্যাখ্যা করতে হবে। aক্লাসের বাইরে কখনই ফাঁস করবেন না!
রেডিওডেফ

0

জেনেরিক অ্যারে শুরু করতে অক্ষমতার বাইপাস করার জন্য আমি একটি দুর্দান্ত অনন্য সমাধান পেয়েছি। আপনাকে যা করতে হবে তা হল এমন একটি বর্গ তৈরি করা যা জেনেরিক ভেরিয়েবল টি এর মতো গ্রহণ করে:

class GenericInvoker <T> {
    T variable;
    public GenericInvoker(T variable){
        this.variable = variable;
    }
}

এবং তারপরে আপনার অ্যারে ক্লাসে ঠিক এটির মতো শুরু করুন:

GenericInvoker<T>[] array;
public MyArray(){
    array = new GenericInvoker[];
}

একটি শুরু new Generic Invoker[]করা যাচাই না করা নিয়ে সমস্যা তৈরি করে তবে আসলে কোনও সমস্যা হওয়া উচিত নয়।

অ্যারে থেকে পেতে আপনার অ্যারে কল করা উচিত [i]। এর মতো পরিবর্তনশীল:

public T get(int index){
    return array[index].variable;
}

বাকিগুলি যেমন অ্যারের পুনরায় আকার দেওয়ার কাজটি অ্যারেএসকপি অফ () দিয়ে করা যেতে পারে:

public void resize(int newSize){
    array = Arrays.copyOf(array, newSize);
}

এবং অ্যাড ফাংশনটি এর মতো যুক্ত করা যেতে পারে:

public boolean add(T element){
    // the variable size below is equal to how many times the add function has been called 
    // and is used to keep track of where to put the next variable in the array
    arrays[size] = new GenericInvoker(element);
    size++;
}

1
প্রশ্নটি জেনেরিক টাইপ প্যারামিটারের ধরণের Tএকটি অ্যারে তৈরির বিষয়ে ছিল, কিছু প্যারামিটারাইজড ধরণের অ্যারে নয়।
সোটিরিওস ডেলিমনোলিস

যদিও এটি একই কাজটি সম্পন্ন করে এবং আপনার পছন্দসই সংগ্রহটি ব্যবহার করা সহজতর করে এমন কোনও শ্রেণিতে আপনাকে চাপ দেওয়া দরকার হয় না।
ক্র্যাব নীহারিকা

কী কাজ ? এটি আক্ষরিকভাবে একটি আলাদা কাজ: জেনেরিক টাইপ প্যারামিটারের অ্যারে বনাম প্যারামটারাইজড টাইপের একটি অ্যারে।
সোটিরিওস ডেলিমানলিস

এটি আপনাকে জেনেরিক টাইপ থেকে একটি অ্যারে তৈরি করতে দেয়? আসল সমস্যাটি জেনেরিক টাইপ ব্যবহার করে একটি অ্যারের সূচনা করছিল যা আমার পদ্ধতিটি ব্যবহার করে আপনাকে ক্লাসে ব্যবহারকারীকে ধাক্কা না দিয়ে বা কোনও স্ট্রিং-তে কোনও অবজেক্ট কাস্ট করার চেষ্টা করার মতো একটি চেক করা ত্রুটি না দিয়েই আপনাকে অনুমতি দেয়। চিলের মতো, আমি যা করি তার মধ্যে আমি সেরা নই, এবং আমি প্রোগ্রামিংয়ের জন্য স্কুলে যাইনি তবে আমার মনে হয় ইন্টারনেটে অন্য কোনও বাচ্চা বলার চেয়ে আমি এখনও কিছুটা ইনপুট প্রাপ্য।
কাঁকড়া নীহারিকা

আমি সোটিরিসের সাথে একমত উত্তরটি ভাবার দুটি উপায় রয়েছে। হয় এটি একটি ভিন্ন প্রশ্নের উত্তর, বা এটি প্রশ্নকে সাধারণীকরণের চেষ্টা। উভয়ই ভুল / সহায়ক নয়। "জেনেরিক অ্যারে" শ্রেণি কীভাবে প্রয়োগ করা যায় সে সম্পর্কে দিকনির্দেশের সন্ধানকারী ব্যক্তিরা / যখন তারা প্রশ্নের শিরোনাম পড়েন তখন পড়া বন্ধ করে দিতেন। এবং যখন তারা 30 টি উত্তর সহ একটি Q খুঁজে পান, তখন তারা শেষের দিকে স্ক্রোল করে কোনও এসও আগত ব্যক্তির কাছ থেকে শূন্য ভোটের উত্তর পড়ার সম্ভাবনা খুব বেশি।
স্টিফেন সি

0

সিনট্যাক্স vnportnoy অনুযায়ী

GenSet<Integer> intSet[] = new GenSet[3];

নাল রেফারেন্সগুলির একটি অ্যারে তৈরি করে, যেমন পূরণ করা যায়

for (int i = 0; i < 3; i++)
{
   intSet[i] = new GenSet<Integer>();
}

যা টাইপ নিরাপদ।


-1
private E a[];
private int size;

public GenSet(int elem)
{
    size = elem;
    a = (E[]) new E[size];
}

আপনার কোডটিতে সর্বদা আপনার ব্যাখ্যা যুক্ত করা উচিত এবং এটি কেন পোস্ট করা মূল প্রশ্নটি সমাধান করে তা ব্যাখ্যা করা উচিত।
মজুয়ারেজ

-1

জেনেরিক অ্যারে তৈরির বিষয়টি জাভাতে অনুমোদিত নয় তবে আপনি এটি পছন্দ মতো করতে পারেন

class Stack<T> {
private final T[] array;
public Stack(int capacity) {
    array = (T[]) new Object[capacity];
 }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.