<T> (কোণ বন্ধনী) জাভাতে কী বোঝায়?


139

আমি বর্তমানে জাভা অধ্যয়ন করছি এবং সম্প্রতি কোণ বন্ধনী (<>) দ্বারা স্টাম্পড করেছি। তারা ঠিক কি মানে?

public class Pool<T>{
    public interface PoolFactory<T>{
        public T createObject();
    }
    this.freeObjects = new ArrayList<T>(maxsize)
}

কী <T>মানে? এর অর্থ কি আমি এই ধরণের একটি বস্তু তৈরি করতে পারি T?


4
আমি আপনার কোডটি বিশ্লেষণ করতে খুব কষ্ট পাচ্ছি। কোনও শুরুর জন্য কোনও ইন্ডেন্টেশন নেই এবং সেখানে দুটি উন্মুক্ত ধনুর্বন্ধনী এবং কেবল একটি বন্ধ রয়েছে। হয় T createObjectপুল বা PoolFactory ভিতরে হতে অনুমিত? কোথায় থাকার this.freeObjects = ...কথা? এটা কি আলাদা উদাহরণ? এটি সেখানে থাকা অবৈধ; এটি একটি পদ্ধতির ভিতরে থাকতে হবে।
মিগিয়াকা

কেউ সম্পর্কে তথ্য খোঁজার হয়, তাহলে <>(হীরা অপারেটর) যা মত ব্যবহার করা যেতে পারে List<Integer> list = new ArrayList<>();দর্শন docs.oracle.com/javase/7/docs/technotes/guides/language/...
পিসেমো

উত্তর:


161

<T>একটি জেনেরিক এবং সাধারণত "ধরণ টি" হিসাবে পড়া যায়। এটি <> এর আসলে কী বোঝায় তার বাম দিকে প্রকারের উপর নির্ভর করে।

আমি জানি না একটি Poolবা PoolFactoryকী, তবে আপনি এটিও উল্লেখ করেছেন ArrayList<T>, যা একটি স্ট্যান্ডার্ড জাভা ক্লাস, তাই আমি তার সাথে কথা বলব।

সাধারণত, আপনি সেখানে "টি" দেখতে পাবেন না, আপনি অন্য ধরণের দেখতে পাবেন। সুতরাং যদি আপনি ArrayList<Integer>উদাহরণস্বরূপ দেখতে পান তবে এর অর্থ "এস ArrayListএর একটি Integer"। উদাহরণস্বরূপ, একটি ধারকটিতে উপাদানগুলির প্রকারকে সীমাবদ্ধ করতে অনেক শ্রেণি জেনেরিক ব্যবহার করে। আর একটি উদাহরণ HashMap<String, Integer>, যার অর্থ " Stringকী এবং Integerমান সহ একটি মানচিত্র "।

আপনার পুল উদাহরণটি কিছুটা আলাদা, কারণ সেখানে আপনি একটি শ্রেণির সংজ্ঞা দিচ্ছেন । সুতরাং সেক্ষেত্রে আপনি এমন একটি ক্লাস তৈরি করছেন যা টি-এর জায়গায় অন্য কেউ নির্দিষ্ট ধরণের দিয়ে ইনস্ট্যান্ট করতে পারে example উদাহরণস্বরূপ, আমি Pool<String>আপনার ক্লাস সংজ্ঞাটি ব্যবহার করে টাইপের একটি অবজেক্ট তৈরি করতে পারি । এর অর্থ দুটি জিনিস হবে:

  • আমার Pool<String>কাছে এমন PoolFactory<String>একটি createObjectপদ্ধতির সাথে ইন্টারফেস থাকবে যা ফেরত দেয় String
  • অভ্যন্তরীণভাবে, এর Pool<String>মধ্যে একটি ArrayListস্ট্রিং থাকে।

এই দুর্দান্ত খবর কারণ অন্য সময়ে, আমি বরাবর আসা এবং একটি তৈরী করতে পারে Pool<Integer>যা একই কোড ব্যবহার, কিন্তু আছে Integerযেখানেই থাকুন না কেন আপনি দেখতে Tউৎস হবে।


3
আমি এখনও অবধি দেখা সেরা ব্যাখ্যাগুলির একটি :) অনেক প্রশংসা !.
সুহাস চিক্কান্না

34

এটা সত্যিই সহজ। এটি J2SE 5 এ একটি নতুন বৈশিষ্ট্য চালু করেছে । শ্রেণীর নামের পরে কৌণিক বন্ধনী উল্লেখ করার অর্থ আপনি একটি অস্থায়ী ডেটা টাইপ তৈরি করছেন যা কোনও ধরণের ডেটা ধরে রাখতে পারে।

উদাহরণ:

class A<T>{
    T obj;
    void add(T obj){
        this.obj=obj;
    }
    T get(){
        return obj;
    }
}
public class generics {
    static<E> void print(E[] elements){
        for(E element:elements){
            System.out.println(element);
        }
    }

    public static void main(String[] args) {
        A<String> obj=new A<String>();
        A<Integer> obj1=new A<Integer>();
        obj.add("hello");
        obj1.add(6);
        System.out.println(obj.get());
        System.out.println(obj1.get());

        Integer[] arr={1,3,5,7};
        print(arr);
    }
}

পরিবর্তে <T>, আপনি আসলে কিছু লিখতে পারেন এবং এটি একইভাবে কাজ করবে। <ABC>জায়গায় লিখতে চেষ্টা করুন <T>

এটি কেবল সুবিধার জন্য:

  • <T> যে কোনও ধরণের হিসাবে উল্লেখ করা হয়
  • <E> উপাদান টাইপ হিসাবে
  • <N> সংখ্যা টাইপ হিসাবে
  • <V> মান হিসাবে
  • <K> চাবি হিসাবে

তবে আপনি এটির যে কোনও নাম রাখতে পারেন, এটি আসলে কিছু যায় আসে না।

অধিকন্তু, Integer, String, Booleanইত্যাদি জাভা যা সংকলন করার সময় ধরনের পরীক্ষণের হেল্প এবং রাপার শ্রেনীর হয়। উদাহরণস্বরূপ, উপরের objকোডটিতে String, টাইপযুক্ত , তাই আপনি এটিতে অন্য কোনও প্রকার যুক্ত করতে পারবেন না (চেষ্টা করুন obj.add(1), এটি একটি ত্রুটি castালবে)। একইভাবে, obj1হয় Integerটাইপ, আপনি এটি (চেষ্টা অন্য কোন প্রকার যোগ করতে পারবেন না obj1.add("hello"), ত্রুটি থাকবে)।


23

এটি জাভাতে জেনেরিকের সাথে সম্পর্কিত। যদি আমি তার উল্লেখ ArrayList<String>করেছি তার অর্থ আমি সেই অ্যারেলিস্টে কেবল স্ট্রিং টাইপ অবজেক্টটি যুক্ত করতে পারি।

জাভাতে জেনেরিকের দুটি প্রধান সুবিধা হ'ল:

  1. আপনার প্রোগ্রামে কাস্টের সংখ্যা হ্রাস করা, এভাবে আপনার প্রোগ্রামে সম্ভাব্য বাগের সংখ্যা হ্রাস করা।
  2. কোডের স্বচ্ছতা উন্নতি করছে

11

জেনেরিক টাইপ বলা হয়। আপনি কোনও পুলে এই জাতীয় বস্তুর ইনস্ট্যান্ট করতে পারেন:

PoolFactory<Integer> pool = new Pool<Integer>();

জেনেরিক প্যারামিটারটি কেবল একটি রেফারেন্স টাইপ হতে পারে। সুতরাং আপনি প্রাক বা ডাবল বা চর বা অন্যান্য আদিম ধরণের মতো আদিম ধরণের ব্যবহার করতে পারবেন না।


9

<>জেনেরিকগুলি নির্দেশ করতে ব্যবহৃত হয়জাভাতে ।

Tএই উদাহরণে এক ধরণের পরামিতি। এবং না: ইনস্ট্যান্টিয়েটিং এমন কয়েকটি জিনিস যা আপনি করতে পারবেন না তার মধ্যে একটিT

উপরে সংযুক্ত টিউটোরিয়াল ছাড়াও অ্যাঞ্জেলিকা ল্যাঙ্গার্স জেনারিক্স এফএকিউ বিষয়বস্তুর একটি দুর্দান্ত উত্স।


8

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

ArrayList<Employee> employees = new ArrayList<Employee>();
ArrayList<Company> companies = new ArrayList<Company>();

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.