কেন একটি "শ্রেণি" ভেরিয়েবল উদাহরণস্বরূপ পাস করা যাবে না?


89

কেন এই কোডটি সংকলন করে না?

    public boolean isOf(Class clazz, Object obj){
        if(obj instanceof clazz){
            return true;
        }else{
            return false;
        }
    }

আমি কেন ক্লাস ভেরিয়েবল পাস করতে পারি না instanceof?

উত্তর:


131

instanceofঅপারেটর রেফারেন্স ধরনের, মত কাজ করে Integerমত, এবং বস্তুর উপর নয়, new Integer(213)। আপনি সম্ভবত কিছু চান

clazz.isInstance(obj)

পার্শ্ব দ্রষ্টব্য: আপনি লিখলে আপনার কোডটি আরও সংক্ষিপ্ত হবে

public boolean isOf(Class clazz, Object obj){
    return clazz.isInstance(obj)
}

যদিও আপনার আর কোনও পদ্ধতির দরকার আছে কিনা তা নিশ্চিত নয় Not


আমি জানি কোডটি সম্পূর্ণ অকেজো, আমি কেবল আমার বিভ্রান্তি প্রদর্শন করতে চাই :)
এরিক 2323223

6
Integerহয় না একটি বর্গ আক্ষরিক। Integer.classএকটি শ্রেণিবদ্ধ আক্ষরিক (দেখুন জেএলএস এর 15.8.2 ডলার : java.sun.com/docs/books/jls/third_edition/html/… )। instanceof: অপারেটর একটি "ReferenceType" (এক ধরনের নাম ওরফে) লাগে উল্লিখিত § JLS এর 15.20.2 java.sun.com/docs/books/jls/third_edition/html/...
জোয়াকিম সয়ার

4
clazz.isInstance(obj)ইতিমধ্যে সরবরাহ করা হয়েছে যেহেতু আমি ব্যবহার করব ।
ডোনাল ফেলো

13

instanceofকেবলমাত্র সুস্পষ্ট শ্রেণীর নাম (সংকলনের সময় বর্ণিত) সহ ব্যবহার করা যেতে পারে। রানটাইম চেক করার জন্য , আপনার করা উচিত:

clazz.isInstance(obj)

clazz.isAssignableFrom(..)কেসটি আরও obj == nullভালভাবে মোকাবেলা করার কারণে এটির একটি ছোট সুবিধা রয়েছে ।


5

অন্যরা যেমন উল্লেখ করেছে, আপনি ক্লাস ভেরিয়েবলটি পাস করতে পারবেন না instanceofকারণ শ্রেণি ভেরিয়েবল কোনও অবজেক্টের উদাহরণ উল্লেখ করে , যখন ডান হাতের প্রকারটিinstanceof হতে হয় । এর অর্থ এই নয় যে "y অবজেক্ট এক্সের একটি উদাহরণ", এর অর্থ "y হ'ল এক্স টাইপের উদাহরণ"। আপনি যদি কোনও অবজেক্ট এবং প্রকারের মধ্যে পার্থক্য জানেন না, তবে বিবেচনা করুন: instanceof

Object o = new Object();

এখানে, টাইপটি হ'ল Object, এবং oসেই প্রকারের সাথে অবজেক্টের উদাহরণের উল্লেখ reference এইভাবে:

if(o instanceof Object)

বৈধ কিন্তু

if(o instanceof o)

oডান হাতের কোনও কারণ নয়, কারণ এটি নয়।

আপনার ক্ষেত্রে আরও নির্দিষ্ট, একটি শ্রেণীর উদাহরণ কোনও ধরণের নয়, এটি একটি অবজেক্ট (যা আপনার জন্য জেভিএম তৈরি করেছে) created আপনার পদ্ধতিতে, Classএক প্রকার, তবে clazzএটি একটি অবজেক্ট (ভাল, কোনও বস্তুর রেফারেন্স))

আপনার যা প্রয়োজন তা হ'ল একটি বস্তুকে ক্লাস অবজেক্টের সাথে তুলনা করার একটি উপায়। এটা পরিনত হয় যে এই জনপ্রিয়, তাই এই শ্রেণীর অবজেক্ট পদ্ধতি হিসেবে আপনাকে সরবরাহিত হয়: isInstance()

এখানে আইসিসট্যান্সের জন্য জাভা ডক, যা এটি আরও ভালভাবে ব্যাখ্যা করে:

public boolean isInstance(Object obj)

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

বিশেষত, যদি এই শ্রেণি অবজেক্টটি একটি ঘোষিত শ্রেণীর প্রতিনিধিত্ব করে তবে নির্দিষ্ট পদ্ধতিটির যুক্তি উপস্থাপন করা শ্রেণীর উদাহরণ (বা এর কোনও সাবক্লাসের) হলে এই পদ্ধতিটি সত্য হয়; অন্যথায় এটি মিথ্যা প্রত্যাবর্তন করে। যদি এই শ্রেণি অবজেক্টটি অ্যারে শ্রেণীর প্রতিনিধিত্ব করে তবে নির্দিষ্ট পদ্ধতিটির যুক্তিটি পরিচয় রূপান্তর বা একটি প্রসারিত রেফারেন্স রূপান্তর দ্বারা অ্যারে শ্রেণীর কোনও বস্তুতে রূপান্তর করা যেতে পারে যদি এই পদ্ধতিটি সত্য হয়; এটি অন্যথায় মিথ্যা ফিরে। যদি এই শ্রেণীর অবজেক্টটি একটি ইন্টারফেসের প্রতিনিধিত্ব করে, নির্দিষ্ট করা অবজেক্ট আর্গুমেন্টের ক্লাস বা কোনও সুপারক্লাস এই ইন্টারফেসটি প্রয়োগ করে তবে এই পদ্ধতিটি সত্য ফিরে আসে; এটি অন্যথায় মিথ্যা ফিরে। যদি এই শ্রেণীর অবজেক্টটি কোনও আদিম ধরণের প্রতিনিধিত্ব করে তবে এই পদ্ধতিটি মিথ্যা প্রত্যাখ্যান করে।

পরামিতি: অবজেক্ট -
রিটার্নগুলি যাচাই করার জন্য অবজেক্ট : সত্য যদি এই ক্লাসের উদাহরণ হয়
তবে: জেডিকে 1.1


3

প্রথমত, instanceofপ্রয়োজন যে ডান দিকে প্রতীক প্রকৃত শ্রেণী (যেমন হয় obj instanceof Objectবা obj instanceof Integer) এবং ধরনের একটি পরিবর্তনশীল Class। দ্বিতীয়ত, আপনি একটি মোটামুটি সাধারণ নবাগত ভুল করেছেন যা আপনার সত্যিই করা উচিত নয় ... নিম্নলিখিত প্যাটার্ন:

যদি ( শর্তসাপেক্ষ_প্রকাশ ) {
    সত্য প্রত্যাবর্তন;
} অন্য {
    প্রত্যাবর্তন মিথ্যা;
}

উপরেরগুলিতে এটিকে রিফ্যাক্ট করা যায়:

প্রত্যাবর্তন শর্তসাপেক্ষ_প্রকাশ ;

আপনার সবসময় সেই রিফ্যাক্টরিং করা উচিত, কারণ এটি যদি অন্যথায় বিবৃতি দেয় তবে তা অপ্রয়োজনীয় দূর করে। একইভাবে, অভিব্যক্তি একই ফলাফল থেকে প্রত্যাবর্তনযোগ্য।return conditional_expression ? true : false;


4
এটা কোন ভুল নয়। সম্ভবত আনাড়ি কিন্তু সম্পূর্ণ ঠিক আছে। অদূর ভবিষ্যতে ফিরে আসার আগে আপনি অতিরিক্ত কোড চান ...
অবিশ্বাস্য জানুয়ারী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.