Instof और Class.isAssignableFrom (…) में क्या अंतर है?


457

निम्नलिखित में से कौन बेहतर है?

a instanceof B

या

B.class.isAssignableFrom(a.getClass())

एकमात्र अंतर जो मुझे पता है, जब 'ए' शून्य है, पहला गलत है, जबकि दूसरा अपवाद फेंकता है। इसके अलावा, क्या वे हमेशा एक ही परिणाम देते हैं?


17
रिकॉर्ड्स के लिए, isInstance () यह जांचने के लिए सबसे सुविधाजनक तरीका है कि क्या किसी ऑब्जेक्ट को एक वर्ग प्रकार में डाला जा सकता है (अधिक जानकारी के लिए, देखें: tshikatshikaaa.blogspot.nl/2012/07// ))
Jérôme Verstrynge

जवाबों:


497

उपयोग करते समय instanceof, आपको Bसंकलन समय पर कक्षा को जानना होगा । उपयोग करते समय isAssignableFrom()यह गतिशील हो सकता है और रनटाइम के दौरान बदल सकता है।


12
मुझे यह नहीं मिला - कृपया विस्तृत करें कि हम क्यों नहीं लिख सकते हैं a instanceof Bref.getClass()। यह इतने कम स्पष्टीकरण (या इसके अभाव) के साथ स्वीकृत उत्तर कैसे हो सकता है?
एलिरन मलका

65
वाक्य-विन्यास a instanceof Brefनहीं है a instanceof Bref.class। इंस्टाफॉपर ऑपरेटर का दूसरा तर्क एक वर्ग का नाम है, न कि क्लास ऑब्जेक्ट उदाहरण के लिए हल करने वाला एक अभिव्यक्ति।
ब्रैंडन ब्लूम

2
हां "गतिशील" बिना कहे चला जाता है :) प्रदर्शन के अलावा, यह एक सही अंतर है।
पेटकर

2
@EliranMalka शायद आपके पास एक वर्ग हो सकता है जो रनटाइम में उत्पन्न हुआ था। वस्तुओं की तरह।
वैगनर त्सुचिया

तो, में B.class.isAssignableFrom(a.getClass()), बी ज्ञात है, और a instanceof Bबेहतर है। सही?
फ्लोरियन एफ

208

instanceofकेवल संदर्भ प्रकारों के साथ उपयोग किया जा सकता है, न कि आदिम प्रकारों के साथ। isAssignableFrom()किसी भी वर्ग की वस्तुओं के साथ इस्तेमाल किया जा सकता है:

a instanceof int  // syntax error
3 instanceof Foo  // syntax error
int.class.isAssignableFrom(int.class)  // true

देख http://java.sun.com/javase/6/docs/api/java/lang/Class.html#isAssignableFrom(java.lang.Class)


10
मैं आदिम प्रकार के साथ Instof / isAssignableFrom का उपयोग करने की बात नहीं देखता।
जिमी टी।

116

प्रदर्शन के संदर्भ में बात करना:

टी एल; डॉ

उपयोग isInstance या instanceof जो इसी तरह के प्रदर्शन की है। isAignignableFrom थोड़ा धीमा है।

प्रदर्शन द्वारा क्रमबद्ध:

  1. isInstance
  2. उदाहरण (+ 0.5%)
  3. isAignignableFrom (+ 2.7%)

JAVA 8 विंडोज x64 पर 2000 पुनरावृत्तियों के एक बेंचमार्क के आधार पर, 20 वार्मअप पुनरावृत्तियों के साथ।

सिद्धांत रूप में

एक नरम जैसे बायटेकोड दर्शक का उपयोग करके हम प्रत्येक ऑपरेटर को बायटेकोड में अनुवाद कर सकते हैं।

के संदर्भ में:

package foo;

public class Benchmark
{
  public static final Object a = new A();
  public static final Object b = new B();

  ...

}

जावा:

b instanceof A;

बाईटकोड:

getstatic foo/Benchmark.b:java.lang.Object
instanceof foo/A

जावा:

A.class.isInstance(b);

बाईटकोड:

ldc Lfoo/A; (org.objectweb.asm.Type)
getstatic foo/Benchmark.b:java.lang.Object
invokevirtual java/lang/Class isInstance((Ljava/lang/Object;)Z);

जावा:

A.class.isAssignableFrom(b.getClass());

बाईटकोड:

ldc Lfoo/A; (org.objectweb.asm.Type)
getstatic foo/Benchmark.b:java.lang.Object
invokevirtual java/lang/Object getClass(()Ljava/lang/Class;);
invokevirtual java/lang/Class isAssignableFrom((Ljava/lang/Class;)Z);

मापने कितने बाईटकोड निर्देश प्रत्येक ऑपरेटर द्वारा उपयोग किया जाता है, हम उम्मीद कर सकता है instanceof और isInstance तुलना में तेजी से होने की isAssignableFrom । हालाँकि, वास्तविक प्रदर्शन बाईटेकोड द्वारा नहीं बल्कि मशीन कोड (जो कि प्लेटफॉर्म पर निर्भर है) द्वारा निर्धारित किया जाता है। प्रत्येक ऑपरेटर के लिए एक माइक्रो बेंचमार्क करते हैं।

बेंचमार्क

क्रेडिट: जैसा कि @ aleksandr-dubinsky द्वारा सलाह दी गई है, और आधार कोड प्रदान करने के लिए @yura को धन्यवाद, यहाँ एक है JMH बेंचमार्क है (यह ट्यूनिंग गाइड देखें ):

class A {}
class B extends A {}

public class Benchmark {

    public static final Object a = new A();
    public static final Object b = new B();

    @Benchmark
    @BenchmarkMode(Mode.Throughput)
    @OutputTimeUnit(TimeUnit.MICROSECONDS)
    public boolean testInstanceOf()
    {
        return b instanceof A;
    }

    @Benchmark
    @BenchmarkMode(Mode.Throughput)
    @OutputTimeUnit(TimeUnit.MICROSECONDS)
    public boolean testIsInstance()
    {
        return A.class.isInstance(b);
    }

    @Benchmark
    @BenchmarkMode(Mode.Throughput)
    @OutputTimeUnit(TimeUnit.MICROSECONDS)
    public boolean testIsAssignableFrom()
    {
        return A.class.isAssignableFrom(b.getClass());
    }

    public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
                .include(TestPerf2.class.getSimpleName())
                .warmupIterations(20)
                .measurementIterations(2000)
                .forks(1)
                .build();

        new Runner(opt).run();
    }
}

निम्नलिखित परिणाम दिए (स्कोर है एक समय इकाई में कई ऑपरेशन हैं , इसलिए स्कोर जितना अधिक होगा):

Benchmark                       Mode   Cnt    Score   Error   Units
Benchmark.testIsInstance        thrpt  2000  373,061 ± 0,115  ops/us
Benchmark.testInstanceOf        thrpt  2000  371,047 ± 0,131  ops/us
Benchmark.testIsAssignableFrom  thrpt  2000  363,648 ± 0,289  ops/us

चेतावनी

  • बेंचमार्क जेवीएम और प्लेटफॉर्म पर निर्भर है। चूंकि प्रत्येक ऑपरेशन के बीच कोई महत्वपूर्ण अंतर नहीं हैं, इसलिए एक अलग जावा संस्करण और / या सोलारिस, मैक या लिनक्स जैसे प्लेटफार्मों पर एक अलग परिणाम (और शायद अलग-अलग आदेश) प्राप्त करना संभव हो सकता है।
  • बेंचमार्क "बी के ए उदाहरण है" की तुलना करता है जब "बी सीधे ए" फैलता है। यदि वर्ग पदानुक्रम अधिक गहरा और अधिक जटिल है (जैसे बी एक्स का विस्तार करता है जो वाई का विस्तार करता है जो जेड का विस्तार करता है जो ए का विस्तार करता है), तो परिणाम भिन्न हो सकते हैं।
  • आमतौर पर यह सलाह दी जाती है कि पहले एक ऑपरेटर (सबसे सुविधाजनक) लेने वाले कोड को लिखने के लिए और फिर एक प्रदर्शन अड़चन होने की जाँच करने के लिए अपने कोड को प्रोफाइल करें। शायद यह ऑपरेटर आपके कोड के संदर्भ में नगण्य है, या हो सकता है ...
  • पिछले बिंदु instanceofके संबंध में, आपके कोड के संदर्भ में isInstanceउदाहरण के लिए अधिक आसानी से अनुकूलित किया जा सकता है ...

आपको एक उदाहरण देने के लिए, निम्नलिखित लूप लें:

class A{}
class B extends A{}

A b = new B();

boolean execute(){
  return A.class.isAssignableFrom(b.getClass());
  // return A.class.isInstance(b);
  // return b instanceof A;
}

// Warmup the code
for (int i = 0; i < 100; ++i)
  execute();

// Time it
int count = 100000;
final long start = System.nanoTime();
for(int i=0; i<count; i++){
   execute();
}
final long elapsed = System.nanoTime() - start;

JIT के लिए धन्यवाद, कुछ बिंदु पर कोड को अनुकूलित किया गया है और हम प्राप्त करते हैं:

  • Instof: 6ms
  • isstance: 12ms
  • isAignignableFrom: 15ms

ध्यान दें

मूल रूप से यह पोस्ट कच्चे JAVA में लूप के लिए अपने स्वयं के बेंचमार्क का उपयोग कर रही थी , जिसने अविश्वसनीय परिणाम दिए जैसे कि जस्ट इन टाइम जैसे लूप को खत्म कर सकता है। इसलिए यह ज्यादातर माप रहा था कि लूप का अनुकूलन करने के लिए जेआईटी कंपाइलर को कितनी देर लगी: प्रदर्शन परीक्षण को पुनरावृत्तियों की संख्या से स्वतंत्र देखें अधिक विवरण के लिए देखें

संबंधित सवाल


6
हां, instanceofएक बाईटेकोड है जो अनिवार्य रूप से उसी तर्क का उपयोग करता है checkcast(कास्टिंग के पीछे बायटेकोड)। यह JITC अनुकूलन की डिग्री की परवाह किए बिना, अन्य विकल्पों की तुलना में स्वाभाविक रूप से तेज़ होगा।
हॉट लीक्स

1
जो समझ में आता है, जैसा isAssignableFrom()कि गतिशील है।
Matthieu

हां, जेएमएच के परिणाम पूरी तरह से अलग हैं (सभी के लिए समान गति)।
यूरा

हाय, अच्छा बेंचमार्क, बस एक ऐसी स्थिति में भाग गया, जहां isAssignableFrom को हजारों बार कहा जाता था, उदाहरण के लिए बदलने से वास्तव में फर्क पड़ा। यह उत्तर कहीं ब्लॉग पोस्ट के लायक होगा ...;)
मार्टिन

33

के बराबर अधिक प्रत्यक्ष a instanceof Bहै

B.class.isInstance(a)

यह काम करता है (रिटर्न गलत) जब aहै nullभी।


कूल, लेकिन यह सवाल का जवाब नहीं देता है और एक टिप्पणी होनी चाहिए थी।
मैडब्रेक्स

23

ऊपर उल्लिखित बुनियादी अंतरों के अलावा, Instof ऑपरेटर और isAssignableFrom विधि के बीच कक्षा में एक मुख्य सूक्ष्म अंतर है।

पढ़ें instanceofके रूप में "यह (बाएं भाग) है (दाएं भाग) इस बात का उदाहरण है या इस से किसी उपवर्ग" और पढ़ने x.getClass().isAssignableFrom(Y.class)के रूप में "कर सकते हैं मैं लिखने X x = new Y()"। दूसरे शब्दों में, उदाहरण के लिए ऑपरेटर यह जाँचता है कि यदि बाईं वस्तु समान है या दाएं वर्ग का उपवर्ग है, जबकि यह isAssignableFromजांचता है कि क्या हम उस वर्ग के संदर्भ में पैरामीटर वर्ग (से) की वस्तु को असाइन कर सकते हैं जिस पर विधि को कहा जाता है।
ध्यान दें कि ये दोनों वास्तविक उदाहरण को संदर्भ प्रकार नहीं मानते हैं।

3 वर्गों ए, बी और सी के उदाहरण पर विचार करें जहां सी का विस्तार बी और बी का विस्तार ए है।

B b = new C();

System.out.println(b instanceof A); //is b (which is actually class C object) instance of A, yes. This will return true.  
System.out.println(b instanceof B); // is b (which is actually class C object) instance of B, yes. This will return true.  
System.out.println(b instanceof C); // is b (which is actually class C object) instance of C, yes. This will return true. If the first statement would be B b = new B(), this would have been false.
System.out.println(b.getClass().isAssignableFrom(A.class));//Can I write C c = new A(), no. So this is false.
System.out.println(b.getClass().isAssignableFrom(B.class)); //Can I write C c = new B(), no. So this is false.
System.out.println(b.getClass().isAssignableFrom(C.class)); //Can I write C c = new C(), Yes. So this is true.

3
b instanceof AA.class.isAssignableFrom(b.getClass())(ओपी के रूप में देखा) के बराबर है । आपका उदाहरण सही है लेकिन अप्रासंगिक है।
कारू

चूंकि new Y()कानूनी नहीं है अगर Yअमूर्त है या सार्वजनिक डिफ़ॉल्ट निर्माता के बिना है, तो आप कह सकते हैं X x = (Y)nullकि कानूनी है और अगर केवल x.getClass().isAssignableFrom(Y.class)सच है।
पृथ्वी इंजन

2
इस उदाहरण में 'b.getClass () .AssignableFrom (A.class)' क्यों है? मुझे लगता है कि उदाहरण ए.कालास.आईएसएग्निसेबल फ़ॉर्म (बी.गोस्टक्लास ()) के विपरीत होना चाहिए।
लोसड वटपक्खा

14

एक और अंतर भी है:

null उदाहरण X falseकोई बात नहीं X क्या है

null.getClass () .AssignableFrom (X) NullPointerException को फेंक देगा


4
-1, गलत: null instanceof X(जहां X संकलन के समय ज्ञात कुछ वर्ग है) हमेशा वापस आ जाएगा false
कैस्पर

4
@ कस्पर जब आप सही हैं, तो मूल विचार एक अच्छा बिंदु था। मैंने पोस्ट को संपादित किया ताकि यह सही हो।
इरिकसन

1
यह सहायक है, किनारे का मामला हमेशा महत्वपूर्ण होता है :)।
ट्रिलियन

पहली पंक्ति के समतुल्य होने के लिए दूसरी पंक्ति क्या होनी X.class.isAssignableFrom(null.getClass())चाहिए? लेकिन हां, getClass()एक शून्य संदर्भ पर कॉल करने के परिणामस्वरूप NPE होगा।
विलियम प्राइस

यह उत्तर बिंदु से चूक जाता है - एक अशक्तता प्रासंगिक नहीं है क्योंकि विफलता ऑपरेशन के बाहर होती है (आपको हमेशा उस तरह के संदर्भ का उपयोग करने से पहले अशक्त की जांच करने की आवश्यकता होती है)। सामान्य तौर पर पहली जगह के getClass()साथ उपयोग नहीं किया जाना चाहिए isAssignableFrom- ऑपरेशन का मतलब वस्तुओं के न होने की स्थिति के लिए है। आप ऑब्जेक्ट संदर्भ है, तो a, उपयोग a instanceof SomeClass(यदि आप ऐसा प्रकार पता SomeClass) या someObject.getClass().isInstance(a)(यदि आप नहीं करते हैं के प्रकार पता someObject)।
एंड्रयूएफ

12

अभी एक और अंतर है। यदि परीक्षण करने के लिए टाइप (क्लास) गतिशील है, उदाहरण के लिए एक विधि पैरामीटर के रूप में पारित किया गया है, तो उदाहरण के लिए यह आपके लिए कटौती नहीं करेगा।

boolean test(Class clazz) {
   return (this instanceof clazz); // clazz cannot be resolved to a type.
}

लेकिन आप कर सकते हैं:

boolean test(Class clazz) {
   return (clazz.isAssignableFrom(this.getClass())); // okidoki
}

उफ़, मैं देख रहा हूं कि यह उत्तर पहले से ही कवर है। हो सकता है कि यह उदाहरण किसी के लिए सहायक हो।


3
वास्तव में कोई जवाब नहीं वास्तव में सही हैअनुकूलनीय काम w / कक्षाएं, Class.isInstance '
instof

कंक्रीट कोड में @ bestsss की सही टिप्पणी डालने के लिए: क्योंकि आपके पास एक ऑब्जेक्ट ( this) है, clazz.isInstance(this)आपके उदाहरण में बेहतर होगा।
एंड्रयूएफ

7

इस धागे ने मुझे कुछ जानकारी प्रदान की कि कैसे इससे instanceofअलग हुआisAssignableFrom कि मैं इससे हूं, इसलिए मैंने सोचा कि मैं अपना खुद का कुछ साझा करूंगा।

मैंने पाया है कि उपयोग करना isAssignableFrom केवल स्वयं करने के लिए (शायद एकमात्र नहीं, बल्कि संभवतः सबसे आसान) तरीका है कि किसी व्यक्ति का स्वयं से पूछें कि क्या एक वर्ग का संदर्भ दूसरे का उदाहरण ले सकता है, जब किसी के पास तुलना करने के लिए न तो कक्षा के उदाहरण हैं।

इसलिए, instanceofजब तक मेरे पास सभी वर्ग नहीं थे, तब तक मैं एक अच्छा विचार होने के लिए असाइनमेंट की तुलना करने के लिए ऑपरेटर का उपयोग नहीं कर पाया , जब तक कि मैंने कक्षाओं में से एक से एक उदाहरण बनाने पर विचार नहीं किया; मुझे लगा कि यह टेढ़ा होगा।


5

Instof का उपयोग आदिम प्रकार या सामान्य प्रकार के साथ नहीं किया जा सकता है। निम्नलिखित कोड के रूप में:

//Define Class< T > type ... 

Object e = new Object();

if(e instanceof T) {
  // Do something.
}

त्रुटि यह है: टाइप पैरामीटर के खिलाफ इंस्टाफॉफ़ चेक नहीं किया जा सकता। टी। इसके बजाय एरेस ऑब्जेक्ट का उपयोग करें क्योंकि आगे सामान्य प्रकार की जानकारी रनटाइम पर मिटा दी जाएगी।

रनटाइम संदर्भ को हटाने के प्रकार के क्षरण के कारण संकलन नहीं करता है। हालाँकि, नीचे दिया गया कोड संकलित होगा:

if( type.isAssignableFrom(e.getClass())){
  // Do something.
}

4

निम्नलिखित स्थिति पर विचार करें। मान लीजिए कि आप जांचना चाहते हैं कि टाइप ए ओबज के प्रकार का एक सुपर क्लास है, तो आप जा सकते हैं

... A.class.isAssignableFrom (obj.getClass ()) ...

या

... obj उदाहरण ए ...

लेकिन isAssignableFrom समाधान के लिए आवश्यक है कि obj का प्रकार यहाँ दिखाई दे। यदि यह मामला नहीं है (उदाहरण के लिए, obj का प्रकार एक निजी आंतरिक वर्ग का हो सकता है), यह विकल्प बाहर है। हालांकि, इंस्टोफ़ समाधान हमेशा काम करेगा।


2
वह सत्य नहीं है। कृपया "एडम Rosenfield" टिप्पणी को देख stackoverflow.com/questions/496928/...
मैक्सिम Veksler

1
क्या आप "यह सच नहीं है" विस्तृत कर सकते हैं? आप जिस टिप्पणी का उल्लेख करते हैं उसका मेरे पोस्ट के परिदृश्य से कोई लेना-देना नहीं है। मेरे पास कुछ परीक्षण कोड हैं जो मेरे स्पष्टीकरण का समर्थन करते हैं।
बीजगणित

यदि आपके पास किसी भी प्रकार के ऑब्जेक्ट उदाहरण ( objइस उदाहरण में) का एक गैर-शून्य संदर्भ है तो आप कार्यान्वयन वर्ग के लिए प्रतिबिंब मेटाडेटा प्राप्त करने के लिए उस पर सार्वजनिक विधि को कॉल कर सकते हैं । यह तब भी सच है जब कि संकलन के समय उस स्थान पर वर्ग प्रकार लागू करना कानूनी रूप से दिखाई नहीं देगा। यह रनटाइम पर ठीक है क्योंकि, आपके पास संदर्भ रखने के लिए , कुछ कोड पथ जो अंततः कक्षा तक कानूनी पहुंच रखता था और आपको इसे लीक (लीक) कर दिया था। getClass()obj
विलियम प्राइस

0
isAssignableFrom(A, B) =

if (A == B) return true
else if (B == java.lang.Object) return false
else return isAssignableFrom(A, getSuperClass(B))

ऊपर दिया गया छद्म कोड एक परिभाषा है, यदि प्रकार / वर्ग ए का संदर्भ प्रकार / वर्ग बी के संदर्भ से उपलब्ध है। यह एक पुनरावर्ती परिभाषा है। कुछ के लिए यह उपयोगी हो सकता है, दूसरों के लिए यह भ्रामक हो सकता है। मैं इसे उस स्थिति में जोड़ता हूं जब किसी को यह उपयोगी लगे। यह सिर्फ मेरी समझ को पकड़ने की कोशिश है, यह आधिकारिक परिभाषा नहीं है। यह एक निश्चित जावा वीएम कार्यान्वयन में उपयोग किया जाता है और कई उदाहरण कार्यक्रमों के लिए काम करता है, इसलिए जब तक मैं यह नहीं समझ सकता कि यह isAignignableFrom के सभी पहलुओं को पकड़ लेता है, यह पूरी तरह से बंद नहीं है।


2
कृपया बताएं कि यह कोड क्या करता है और यह प्रश्न का उत्तर कैसे देता है।
निधि मोनिका का मुकदमा

0

प्रदर्शन के संदर्भ में बात करते हुए "2" (JMH के साथ):

class A{}
class B extends A{}

public class InstanceOfTest {

public static final Object a = new A();
public static final Object b = new B();

@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public boolean testInstanceOf()
{
    return b instanceof A;
}

@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public boolean testIsInstance()
{
    return A.class.isInstance(b);
}

@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public boolean testIsAssignableFrom()
{
    return A.class.isAssignableFrom(b.getClass());
}

public static void main(String[] args) throws RunnerException {
    Options opt = new OptionsBuilder()
            .include(InstanceOfTest.class.getSimpleName())
            .warmupIterations(5)
            .measurementIterations(5)
            .forks(1)
            .build();

    new Runner(opt).run();
}
}

यह देता है:

Benchmark                            Mode  Cnt  Score   Error  Units
InstanceOfTest.testInstanceOf        avgt    5  1,972 ? 0,002  ns/op
InstanceOfTest.testIsAssignableFrom  avgt    5  1,991 ? 0,004  ns/op
InstanceOfTest.testIsInstance        avgt    5  1,972 ? 0,003  ns/op

ताकि हम निष्कर्ष निकाल सकें: उदाहरण के रूप में उपवास के रूप में isInstance () और isAssignableFrom () दूर नहीं (+ 0.9% निष्पादन समय)। इसलिए कोई भी वास्तविक अंतर नहीं है जो भी आप चुनते हैं


0

इसे एक्शन में दिखाने के लिए कुछ उदाहरणों के बारे में ...

@Test
public void isInstanceOf() {
    Exception anEx1 = new Exception("ex");
    Exception anEx2 = new RuntimeException("ex");
    RuntimeException anEx3 = new RuntimeException("ex");

    //Base case, handles inheritance
    Assert.assertTrue(anEx1 instanceof Exception);
    Assert.assertTrue(anEx2 instanceof Exception);
    Assert.assertTrue(anEx3 instanceof Exception);

    //Other cases
    Assert.assertFalse(anEx1 instanceof RuntimeException);
    Assert.assertTrue(anEx2 instanceof RuntimeException);
    Assert.assertTrue(anEx3 instanceof RuntimeException);
}

@Test
public void isAssignableFrom() {
    Exception anEx1 = new Exception("ex");
    Exception anEx2 = new RuntimeException("ex");
    RuntimeException anEx3 = new RuntimeException("ex");

    //Correct usage = The base class goes first
    Assert.assertTrue(Exception.class.isAssignableFrom(anEx1.getClass()));
    Assert.assertTrue(Exception.class.isAssignableFrom(anEx2.getClass()));
    Assert.assertTrue(Exception.class.isAssignableFrom(anEx3.getClass()));

    //Incorrect usage = Method parameter is used in the wrong order
    Assert.assertTrue(anEx1.getClass().isAssignableFrom(Exception.class));
    Assert.assertFalse(anEx2.getClass().isAssignableFrom(Exception.class));
    Assert.assertFalse(anEx3.getClass().isAssignableFrom(Exception.class));
}

-2

हमारी टीम में किए गए कुछ परीक्षण बताते हैं कि इससे A.class.isAssignableFrom(B.getClass())अधिक तेजी से काम होता है B instanceof A। यह बहुत उपयोगी हो सकता है यदि आपको बड़ी संख्या में तत्वों की जांच करने की आवश्यकता हो।


13
हम्म, यदि आपके पास एक अड़चन है instanceof, तो मेरा मानना ​​है कि आपको गंभीर डिजाइन की समस्याएं हैं ...
11'11

1
जेबीई द्वारा उत्तर एक परिकल्पना प्रस्तुत करता है जो आपकी परिकल्पना से अलग है।
एलेस्टर मूडी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.