জাভাতে উদাহরণ (ক্লাস <?> সি) এর মতো কিছু আছে কি?


88

আমি যাচাই করতে চাই যে কোনও বস্তু oশ্রেণীর Cউদাহরণ বা একটি সাবক্লাসের C

উদাহরণস্বরূপ, যদি আপনার pক্লাসের হয় Pointআমি চাই x.instanceOf(Point.class)হতে trueএবং x.instanceOf(Object.class)হতে true

আমি এটি বক্সযুক্ত আদিম ধরণের জন্যও কাজ করতে চাই। উদাহরণস্বরূপ, যদি xহয় Integerতবে তা x.instanceOf(Integer.class)হওয়া উচিত true

সেখানে কি এমন জিনিস আছে? যদি তা না হয় তবে আমি কীভাবে এ জাতীয় পদ্ধতি বাস্তবায়ন করতে পারি?


উত্তর:


174

Class.isInstance আপনি যা চান তা করে।

if (Point.class.isInstance(someObj)){
    ...
}

অবশ্যই, আপনি instanceofপরিবর্তে ব্যবহার করতে পারলে আপনার এটি ব্যবহার করা উচিত নয় , তবে প্রতিবিম্বের পরিস্থিতিতে এটি প্রায়শই কাজে আসে।


6
@ আহমাদ এটি সম্ভবত ধীর, তবে এর চেয়ে খারাপ আরও বোঝা শক্ত! যদি কিছু করার খুব সহজ উপায় থাকে - যেমন if (a instanceof Point)- তবে আপনি আরও বিশৃঙ্খল উপায়ে এটি করেন তবে যে কেউ কোডটি পড়েন তিনি "ওহ, কঠোরভাবে এটি করার জন্য একটি কারণ থাকতে হবে" ভেবে বাধ্য হতে হবে, এবং তারপরে কীভাবে Class.isInstanceআলাদা হয় তা জানতে ডক্সে ঝাঁপুন instanceof। আপনি আপনার সহকর্মীদের সময় নষ্ট করেন।
গুস্টাফসি

21

আমি পরীক্ষা করতে চাই যে কোনও অবজেক্ট o ক্লাস সি এর উদাহরণ বা সি এর সাবক্লাসের কিনা। উদাহরণস্বরূপ, পি যদি ক্লাস পয়েন্ট হয় তবে আমি x.instanceOf (পয়েন্ট.class) চাই

উম ... কি? ও, পি এবং এক্স কি?

আমি এটি আদিম ধরণের জন্যও কাজ করতে চাই। উদাহরণস্বরূপ, x যদি একটি পূর্ণসংখ্যা হয় তবে x.instanceOf (Integer.class) এবং x.instanceOf (Object.class) সত্য হওয়া উচিত।

এটি এমনকি সংকলন করা উচিত নয়। আদিমগণ কোনও বস্তু নয় এবং আপনি সেগুলিতে কল করতে পারবেন না।

যাইহোক, তিনটি জিনিস রয়েছে যার মধ্যে একটি অবশ্যই আপনি যা চান তা অর্জন করতে পারে (ঠিক কিছুটা প্রয়োগের ক্ষেত্রে সেগুলি কিছুটা পৃথক হয়:

  • instanceofঅপারেটর আপনি কম্পাইল সময়ে বর্গ জানি পারেন।
  • Class.isInstance () আপনি কম্পাইল সময়ে অজ্ঞাত শ্রেণীর বিরুদ্ধে কোনও অবজেক্টের ক্লাস পরীক্ষা করতে চান।
  • Class.isAssignableFrom () আপনি যদি দুটি শ্রেণীর অবজেক্ট প্রদত্ত কার্যকারিতাটি পরীক্ষা করতে চান তবে।

9
x instanceof Integer
x instanceof Object

আপনাকে ঠিক সঠিক বাক্য গঠন ব্যবহার করতে হবে

প্রাথমিক প্রকারের জন্য, আপনাকে এটি সম্পূর্ণ আলাদা করতে হবে। যেহেতু আপনি তাদের জন্য পদ্ধতি তৈরি করতে পারবেন না, আপনার একটি ক্লাস প্রয়োজন যা পদ্ধতিটি রাখে। সুতরাং "x.instanceOf (পূর্ণসংখ্যা.ক্লাস)" এর পরিবর্তে আপনাকে "MyClassComparer.instanceOf (x, Integer.Class)" বা এর মতো কিছু কল করতে হবে। এটি ওভারলোডিং পদ্ধতিগুলির মাধ্যমে সহজেই প্রয়োগ করা যেতে পারে, তবে সেই কার্যকারিতাটি একেবারেই আকাঙ্ক্ষিত হবে এমন কোনও মামলা আমি দেখতে ব্যর্থ হয়েছি।


4

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

if(obj instanceof SomeClass) {
    // Do something
}

জাভা টিউটোরিয়ালটিতে এই অপারেটরের একটি ভাল উদাহরণ রয়েছে


4
আপনি আদিম ধরণের উদাহরণগুলি ব্যবহার করতে পারবেন না
ডিএফএ

4
তিনি বস্তুগুলির সাথে আদিম ধরণের গুলিয়ে ফেলেন। দয়া করে পড়ুন ... "উদাহরণস্বরূপ, x যদি একটি পূর্ণসংখ্যা হয় তবে x.instanceOf (Integer.class) এবং x.instanceOf (অবজেক্ট.ক্লাস) সত্য হওয়া উচিত" " সমস্ত উত্তর ডাউন ভোট দিয়ে লজ্জা পান
বিজয়ী হুগো

জাভা টিউটোরিয়ালটি ব্যবহারের পরামর্শ সেকেন্ডিং (স্প)। এটি ভাষা শেখার জন্য একটি ভাল রেফারেন্স।
luis.espinal

0

আপনি করতে পারেন:

if (foo instanceof classNameYouWantToCheck) 

আপনি আদিম ধরণের উদাহরণগুলি ব্যবহার করতে পারবেন না
ডিএফএ

ক্লাসটি ছিল কেবল সেখানে শ্রেণীর নাম লিখতে হবে তা দেখানোর জন্য। আমি এটি ঠিক করব
fmsf

0

"আমি এটি আদিম ধরণের জন্যও কাজ করতে চাই instance উদাহরণস্বরূপ, x যদি একটি পূর্ণসংখ্যা হয় তবে x.instanceOf (Integer.class) এবং x.instanceOf (অবজেক্ট.class) সত্য হওয়া উচিত" "

কেন? আদিম ধরণের এবং রেফারেন্সের ধরণগুলি সম্পূর্ণ পৃথক। একটি আদিম কোন পূর্ণসংখ্যা বা অবজেক্টের উপপ্রকার নয়। একটি আদিম মানের ধরণটি সর্বদা সংকলনের সময় স্থিতিশীলভাবে জানা থাকে, সুতরাং এর ধরণের পরীক্ষা করার কোনও মানে নেই। অবশ্যই, আপনি একটি আদিম মান বাক্স করতে পারেন এবং তার প্রকারটি পরীক্ষা করতে পারেন:

(Integer)5 instanceof Integer

তবে কী হবে?


-2

আমি মনে করি আপনি কাঁচামাল জিনিস এবং জেনেরিকের জন্য উদাহরণ সম্পর্কে বিভ্রান্ত হয়ে পড়েছেন

obj instanceof Class
obj instanceof Class<?> // this is the one you want

4
টাইপ ইরেজরের কারণে আপনি ইনস্ট্যান্টের ডানদিকে জেনেরিকগুলি ব্যবহার করতে পারবেন না।
ম্যাথিয়াস

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