java: Class.isInstance বনাম Class.isAignignFrom


232

দিন clazzকিছু হতে Classএবং objকিছু হতে Object

কি

clazz.isAssignableFrom(obj.getClass())

সর্বদা হিসাবে একই

clazz.isInstance(obj)

?

তা না হলে পার্থক্য কী?


25
যদি আপত্তি == নাল, দ্বিতীয়টি মিথ্যা দেয়, প্রথমটি দেয় না। ;)
পিটার লরে

21
@PeterLawrey, প্রথমে একটি নিক্ষেপ করা হবে NullPointerExceptionযদি obj == null
রাইভেন্টেজ

পাওয়া hrere থেকে নমুনার সাথে কিছু উত্তর: mytechnotes.biz/2012/07/...
Paramesh Korrakuti

4
পাঠকদের কাছে: আপনি এমন গভীর, অন্ধকার, কালো গর্তের মধ্যে প্রবেশ করতে চলেছেন যেখান থেকে আপনি কখনই পালাতে পারবেন না। পার্থক্যগুলি অবিরাম। আপনি এখনও করতে পারেন এমন সময় ছেড়ে দিন: stackoverflow.com/q/496928/1599699
অ্যান্ড্রু

@ পরমেশকোরাকাকুতি এই ডোমেনটির নামটি tshikatshikaa.blogspot.com/2012/07/… তে
জেরমে ভার্সেটেঞ্জ

উত্তর:


222

clazz.isAssignableFrom(Foo.class)যখনই clazzবস্তুটি প্রতিনিধিত্ব করে বর্গটি একটি সুপারক্লাস বা সুপারিন্টারফেস হবে তখনই সত্য হবে Foo

clazz.isInstance(obj)যখনই বস্তু objশ্রেণীর উদাহরণ হিসাবে আসল হবে তখনই সত্য হবে clazz

এটাই:

clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)

সবসময় তাই যতদিন সত্য clazzএবং objnonnull হয়।


3
এটি ফুস এর মত একই ঘটনাটিকে বাদ দেয় যেখানে হু হু করে ফেলা হয় - যে ক্ষেত্রে এটি সত্য হয়: নীচে পলস শীর্ষ-ভোটিত উত্তরগুলি এটিকে সংশোধন করে
রবারবার

3
আমি সম্মত হই যে যখন ক্লাজটি একটি ফু হয়, তবে ক্লাজ.আইএসাইনযোগ্যফ্রম (Foo.class) সত্য হয়। আমি অন্যথায় কোথায় বললাম?
uckelman

5
@ গিলি এটি উক্কেলম্যান যা বলেছিল তা নয়। দয়া করে তার উত্তরটি পুনরায় পড়ুন।
পুস

2
Byte b = 3; Comparable.class.isAssignableFrom(b.getClass()) == Comparable.class.isInstance(b)); -> ইন্টারফেসের ক্ষেত্রেও এটি সত্য।
পুস

1
প্রযুক্তি: যদি objহয় nullতবে clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)একটি নিক্ষেপ করবে NullPointerExceptionএবং ফিরে আসবে না true
অ্যান্ড্রু ম্যাকেরেট

196

উভয় উত্তর বলপার্কে রয়েছে তবে একটিও সম্পূর্ণ উত্তর নয়।

MyClass.class.isInstance(obj)একটি উদাহরণ যাচাই করার জন্য। এটি সত্য হয় যখন প্যারামিটার উদ্দেশ্যটি অকার্যকর হয় এবং এটিকে MyClassনা বাড়িয়ে দেওয়া যেতে পারে ClassCastException। অন্য কথায়, আপত্তি একটি উদাহরণ MyClassবা এর সাবক্লাস।

MyClass.class.isAssignableFrom(Other.class)সত্য MyClassহিসাবে ফিরে আসবে যদি , বা একটি সুপারক্লাস বা সুপারিন্টারফেস Other,। Otherএকটি ক্লাস বা একটি ইন্টারফেস হতে পারে। এটি সত্য Otherরূপে উত্তর দেয় যদি ক MyClass

প্রদর্শনের জন্য একটি ছোট কোড:

public class NewMain
{
    public static void main(String[] args)
    {
        NewMain nm = new NewMain();
        nm.doit();
    }

    class A { }

    class B extends A { }

    public void doit()
    {
        A myA = new A();
        B myB = new B();
        A[] aArr = new A[0];
        B[] bArr = new B[0];

        System.out.println("b instanceof a: " + (myB instanceof A)); // true
        System.out.println("b isInstance a: " + A.class.isInstance(myB)); //true
        System.out.println("a isInstance b: " + B.class.isInstance(myA)); //false
        System.out.println("b isAssignableFrom a: " + A.class.isAssignableFrom(B.class)); //true
        System.out.println("a isAssignableFrom b: " + B.class.isAssignableFrom(A.class)); //false
        System.out.println("bArr isInstance A: " + A.class.isInstance(bArr)); //false
        System.out.println("bArr isInstance aArr: " + aArr.getClass().isInstance(bArr)); //true
        System.out.println("bArr isAssignableFrom aArr: " + aArr.getClass().isAssignableFrom(bArr.getClass())); //true
    }
}

10
কেন আপনার উদাহরণে "বি isignableFrom a:" তবে কোডটি হল A.class.isAssignableFrom(B.class)? আমি আউটপুট দ্বারা বিভ্রান্ত হয়েছি :)
রোমান ট্রুবা

4
উম্মম ... আপনার সমস্ত উদাহরণে "উদাহরণস্বরূপ" যদি সত্য হয় যদি "ইসসাইনেবলফর্ম" সত্য প্রত্যাবর্তন করে ... আমি পার্থক্যটি এভাবে দেখছি না।
অ্যান্ড্রয়েড বিকাশকারী

2
সতর্কতা অবলম্বন করুন প্রিন্ট করা পাঠ্য কোডটির সাথে মেলে না এবং বিভ্রান্তিকর হতে পারে ... উদাহরণ: "System.out.println (" b isAignignFrom a: "+ A.class.isAignignFrom (B.class));"
পলস্টার 21

21
@ পল উত্তরটি যেমনটি সাহায্যকারী নয়, কারণ পাঠক এই ভেবে অবাক হয়ে যান যে "কোনও শ্রেণীর সাবক্লাসের উদাহরণ হওয়া এবং বস্তুর ধরণটি শ্রেণিতে রূপান্তরিত হওয়ার মধ্যে কী পার্থক্য?" অবশ্যই, আপনি দেখতে পাচ্ছেন যে আপনি এই পৃষ্ঠায় আসার সময় আপনার উত্তরটি পড়ার পরে পাঠককে অনেকগুলি প্রশ্ন রেখে গেছেন। আরও ভাল উত্তর আসলে পার্থক্যটি ব্যাখ্যা করবে (বা এর অভাব)। যদি কোনও পার্থক্য না থাকে তবে উত্তরের উত্তরটি সরাসরি বলা উচিত, "কোনও ব্যবহারিক পার্থক্য নেই।"
আলেকসান্দ্র ডাবিনস্কি

2
আরও গুরুত্বপূর্ণ বিষয়, হেক্স তাদের উদ্দেশ্যগুলির জন্য কী ব্যবহার করবেন তা পাঠক ভাবছেন। প্রশ্নের মন্তব্য অনুসারে, বস্তুটি শূন্য হলে isAssignableFrom()একটি নিক্ষেপ করে NullPointerException, যেখানে isInstance()কেবল মিথ্যা ফিরিয়ে দেয়। এটাই আসল উত্তর।
অ্যান্ড্রু

6

আমি মনে করি এই দুজনের জন্য ফলাফল সর্বদা এক হওয়া উচিত। পার্থক্যটি হ'ল আপনার ব্যবহারের জন্য ক্লাসের একটি উদাহরণ প্রয়োজন isInstanceতবে কেবলমাত্র Classঅবজেক্টটি ব্যবহার করতে isAssignableFrom


এটি 100% সত্য নয়। Comparable.class.isAssignableFrom(Byte.class) == trueকিন্তু Byte.class.isInstance(Comparable.class) == false। অন্য কথায়, isInstance()ইন্টারফেসের জন্য প্রতিসম নয়, কেবল সাবক্লাসের জন্য।
গিলি

6
@ গিলি: আপনি এখানে কিছুটা ভুল পেয়েছেন। Byte.class.isInstance(Comparable.class)মিথ্যা কারণ কোনও Classবস্তুর উদাহরণ নেই Byte। সঠিক তুলনা Comparable.class.isAssignableFrom(Byte.class)হয় Comparable.class.isInstance((byte) 1), যা সত্য।
কলিনড

1
আমি একমত নই আপনি যদি আপনার জাভাদোকটি সন্ধান করেন তবে Byteআবিষ্কার করবেন এটি প্রসারিত Numberএবং একটি বর্গ। (byte) 1এর সমতুল্য নয় Byte। প্রাক্তন একটি আদিম। পরেরটি একটি ক্লাস।
গিলি

2
@Gili: Autoboxing আদিম কাস্ট byteকরার Byteকারণ প্যারামিটার প্রকার isInstanceহয় Object
কলিনড

2
ঠিক আছে. আমার মূল বক্তব্যটি হ'ল কলগুলি একে অপরের কাছে একেবারে প্রতিসাম্য নয়, তবে আপনার উত্তরটি পুনরায় পড়ার পরে আপনি কখনই এই দাবিটি করেননি যাতে আপনি ঠিকই থাকেন।
গিলি

6

বংশবৃদ্ধির জন্য, আমরা নীচের মতো এই দুটি এপিআই বুঝতে পারি:

  1. X.class.isAssignableFrom(Y.class)

যদি Xএবং Yএকই শ্রেণীতে, অথবা Xহয় Yএর সুপার বর্গ বা সুপার ইন্টারফেস, সত্য, অন্যথায়, মিথ্যা ফিরে।

  1. X.class.isInstance(y)

বলুন yক্লাসের একটা নিদর্শন হয় Y, যদি Xএবং Yএকই শ্রেণীতে, অথবা Xহয় Yঅন্যথায়, মিথ্যা 'র সুপার বর্গ বা সুপার ইন্টারফেস, সত্য ফিরে।

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