কীভাবে কোনও বস্তুর শ্রেণি নির্ধারণ করবেন?


509

যদি শ্রেণি Bএবং শ্রেণি শ্রেণীর Cবর্ধিত হয় Aএবং আমার ধরণের একটি অবজেক্ট থাকে Bবা তবে C, আমি কোন ধরণের এটি উদাহরণ হিসাবে নির্ধারণ করতে পারি?


14
@ স্টারব্লিউ Castালাই প্রথম জিনিস মনে আসবে। আমার সন্দেহ instanceof যদি এটা জন্য কোনো প্রয়োজন ছিল না অপারেটর থাকবে।
b1nary.atr0phy

@ b1nary.atr0phy প্রথমে isntanceof অপারেটরটি ব্যবহার করা ভাল হবে না। যদি কোনও বেমানান ধরণের কাস্ট থাকে তবে আমি বিশ্বাস করি যে ক্লাসকাস্টএক্সেপশনের ফলাফল হবে
প্রতিশ্রুতিবদ্ধ

উত্তর:


800
if (obj instanceof C) {
//your code
}

31
বিপরীত চেকটি নোট করা বা কোনও বিষয় কোনও শ্রেণীর উদাহরণ নয় কিনা তা কীভাবে পরীক্ষা করা যায় তা নোট করে রাখা কার্যকর:if(!(obj instanceof C))
ডিউজুনাইট

32
আমি বিশ্বাস করি getClass () পদ্ধতিটি মূল প্রশ্নের উত্তর। এই ক্ষেত্রে (আপত্তি উদাহরণ এ) "সত্য" আউটপুটও দেবে তবে উদ্দেশ্যটি হ'ল ছবিতে অবজেক্টের রানটাইম ক্লাসটি সন্ধান করা। যদি প্যারেন্ট 1 টি চাইল্ড 1 এবং চাইল্ড 2 দ্বারা প্রসারিত হয় তবে নীচের code চাইল্ড 1 চাইল্ড 1 = নতুন চাইল্ড 1 () চেষ্টা করুন; প্যারেন্ট 1 প্যারেন্টচাইল্ড = নতুন চাইল্ড 2 (); চাইল্ড 2 চাইল্ড 2 = নতুন চাইল্ড 2 (); (সন্তানের 1 উদাহরণস্বরূপ প্যারেন্ট 1); (চাইল্ড 1 উদাহরণসুত্র শিশু 1); (চাইল্ড 2 অফ প্যারেন্টচিল্ড); (পিতা-মাতৃত্বের প্রথম উদাহরণ পিতা-মাতা 1); (চাইল্ড 1 উদাহরণস্বরূপ পিতা-সন্তানের); code , এটি উদাহরণের উদ্দেশ্যটি পরিষ্কার করতে পারে।
ভবেশ আগরওয়াল

ইন্টারফেস তৈরির অবশ্যই একটি বিকল্প
জনমারলিনো

3
আমার যদি দুটি ক্লাস একক ইন্টারফেস বাস্তবায়ন করে থাকে? আমি কীভাবে অবজেক্টের সঠিক শ্রেণি পৃথক করব?
অলিভ

3
যদিও একটি জিনিস, এটি কাজ করে না যদি আপত্তি নাল হয়। সমাধানটি তখন প্যারেন্টি ইন্টারফেস.ক্লাস.আইসিসিজেবলফ্রোম (চাইল্ড.ক্লাস) হবে
এলেক্সব্যাট

351

অবজেক্ট.জেটক্লাস () ব্যবহার করুন । এটি বস্তুর রানটাইম টাইপ প্রদান করে।


12
এটি আসলে আপনি কীভাবে কোনও
সামগ্রীর

নিশ্ছিদ্র উত্তর @Bill
গৌরব

1
কেন এটি সর্বাধিক জনপ্রিয় উত্তর নয় তা নিশ্চিত নন
eksl

178

একাধিক সঠিক উত্তর উপস্থাপন করা হয়েছিল, তবে আরও আরও পদ্ধতি রয়েছে: Class.isAssignableFrom()এবং কেবলমাত্র বস্তুটি কাস্ট করার চেষ্টা করা হয়েছে (যা একটি ফেলে দিতে পারে ClassCastException)।

সম্ভাব্য উপায়গুলির সংক্ষিপ্তসার

আসুন পরীক্ষার সম্ভাব্য উপায়গুলি সংক্ষিপ্ত করে দেখি যদি কোনও বস্তু objটাইপের উদাহরণ হিসাবে থাকে C:

// Method #1
if (obj instanceof C)
    ;

// Method #2
if (C.class.isInstance(obj))
    ;

// Method #3
if (C.class.isAssignableFrom(obj.getClass()))
    ;

// Method #4
try {
    C c = (C) obj;
    // No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}

// Method #5
try {
    C c = C.class.cast(obj);
    // No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}

nullপরিচালনার ক্ষেত্রে পার্থক্য

nullপরিচালনা করার ক্ষেত্রে একটি পার্থক্য রয়েছে যদিও:

  • প্রথম 2 পদ্ধতিতে এক্সপ্রেশনগুলি falseযদি objহয় null( nullতবে কোনও কিছুর উদাহরণ নয়) তা মূল্যায়ন করে ।
  • 3 য় পদ্ধতি একটি NullPointerExceptionস্পষ্টতই নিক্ষেপ করবে ।
  • বিপরীতে 4 র্থ এবং 5 ম পদ্ধতিগুলি গ্রহণ করুন nullকারণ nullযে কোনও ধরণের কাস্ট করা যেতে পারে!

মনে রাখতে হবে: null এটি কোনও ধরণের উদাহরণ নয় তবে এটি কোনও প্রকারে কাস্ট করা যেতে পারে

মন্তব্য

  • Class.getName()" আইটেম - অফ- " পরীক্ষা করার জন্য ব্যবহার করা উচিত নয় যদি বস্তুটি টাইপ না করে Cতবে এর একটি সাবক্লাস থাকে, এটির সম্পূর্ণ আলাদা নাম এবং প্যাকেজ থাকতে পারে (সুতরাং শ্রেণীর নামগুলি অবশ্যই মেলে না) তবে এটি এখনও টাইপ C
  • একই উত্তরাধিকার কারণে প্রতিসমClass.isAssignableFrom() নয় : প্রকারটি যদি একটি সাবক্লাস হয় তবে ফিরে আসবে ।
    obj.getClass().isAssignableFrom(C.class)falseobjC

6
এটি বিভিন্ন পদ্ধতিতে অনেকগুলি ঘটনার সত্যই দুর্দান্ত সংক্ষিপ্তসার। যেমন একটি সম্পূর্ণ লেখার জন্য ধন্যবাদ!
কেলসিন

32

তুমি ব্যবহার করতে পার:

Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object

আছে HTH। তবে আমি মনে করি বেশিরভাগ সময় নিয়ন্ত্রণ প্রবাহ বা অনুরূপ কোনও কিছুর জন্য এটি ব্যবহার করা ভাল অভ্যাস নয় ...


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

24

প্রস্তাবিত যে কোনও পদ্ধতির যে কোনও ব্যবহারকে কোড গন্ধ হিসাবে বিবেচনা করা হয় যা খারাপ ওও ডিজাইনের ভিত্তিতে তৈরি।

যদি আপনার নকশাটি ভাল হয় তবে আপনার নিজেকে ব্যবহার করার প্রয়োজন getClass()বা খুঁজে পাওয়া উচিত নয় instanceof

প্রস্তাবিত পদ্ধতিগুলির যে কোনও একটি করবে, তবে ডিজাইনের ভিত্তিতে কিছু মনে রাখবেন something


3
হ্যাঁ, সম্ভবত getClass এবং উদাহরণস্বরূপ ব্যবহারের 99% পলিমারফিক পদ্ধতিতে কল এড়ানো যায়।
দ্য টিকটিকিটি

3
আমি একমত এই ক্ষেত্রে আমি এক্সএমএল থেকে উত্পাদিত অবজেক্টগুলির সাথে কাজ করছি যা খারাপভাবে ডিজাইন করা স্কিমার সাথে আমার মালিকানা নেই।
ক্যারিয়ার

28
নেসেসক্যালি নয়। কখনও কখনও ইন্টারফেস পৃথকীকরণ ভাল। এমন অনেক সময় আছে যখন আপনি জানতে চান যে A একটি B, তবে আপনি এটিকে বাধ্যতামূলক করতে চান না যে A একটি B, কারণ কেবলমাত্র বেশিরভাগ কার্যকারিতার জন্য A প্রয়োজন - বি এর alচ্ছিক কার্যকারিতা রয়েছে।
MetroidFan2002

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

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

15

আমরা এক্ষেত্রে প্রতিবিম্ব ব্যবহার করতে পারি

objectName.getClass().getName();

উদাহরণ: -

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String name = request.getClass().getName();
}

এই ক্ষেত্রে আপনি ক্লাসের নামটি পাবেন যা কোন HttpServletRequestইন্টারফেসের রেফারেন্স ভেরিয়েবলের কাছে পাস করবে object


এটা সঠিক। শুধুমাত্র ব্যবহার obj.getClass()শব্দ classname, prefixex ফিরে আসবেclass
x6iae

request.getClass().getName();সমস্ত প্যাকেজ মুদ্রণ! শ্রেণীর নাম সহ
শরিফ

13

ক্লাসে একটি .isInstanceপদ্ধতিও রয়েছে Class। যদি আপনি একটি বস্তুর বর্গ পেতে মাধ্যমে myBanana.getClass()যদি আপনি আপনার বস্তুর দেখতে পারেন myAppleহিসাবে একই ক্লাসের একটা নিদর্শন হয় myBananaমাধ্যমে

myBanana.getClass().isInstance(myApple)


0

আমি আমার জেনারেল ইউটিস ক্লাসে ঘা ফাংশনটি ব্যবহার করি, এটি কার্যকর হতে পারে তা পরীক্ষা করুন

    public String getFieldType(Object o) {
    if (o == null) {
        return "Unable to identify the class name";
    }
    return o.getClass().getName();
}

0

আমি জাভা 8 জেনেরিকগুলি রানটাইমটিতে স্যুইচ কেসটি ব্যবহার না করার পরিবর্তে অবজেক্টের উদাহরণটি কী তা পেতে পেতে ব্যবহার করি

 public <T> void print(T data) {
    System.out.println(data.getClass().getName()+" => The data is " + data);
}

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

    String str = "Hello World";
    int number = 10;
    double decimal = 10.0;
    float f = 10F;
    long l = 10L;
    List list = new ArrayList();
    print(str);
    print(number);
    print(decimal);
    print(f);
    print(l);
    print(list);

নিম্নলিখিত আউটপুট হয়

java.lang.String => The data is Hello World
java.lang.Integer => The data is 10
java.lang.Double => The data is 10.0
java.lang.Float => The data is 10.0
java.lang.Long => The data is 10
java.util.ArrayList => The data is []
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.