জাভাতে কোনও ক্লাস অবজেক্ট অন্য শ্রেণীর অবজেক্টের সাবক্লাস কিনা তা পরীক্ষা করুন


196

আমি জাভার প্রতিচ্ছবি এপিআই দিয়ে ঘুরে বেড়াচ্ছি এবং কয়েকটি ক্ষেত্র পরিচালনা করার চেষ্টা করছি। এখন আমি আমার ক্ষেত্রের ধরণ চিহ্নিত করতে আটকে আছি। স্ট্রিংগুলি সহজ, কেবলমাত্র myField.getType().equals(String.class)। একইটি অন্যান্য উদ্ভূত শ্রেণীর জন্য প্রযোজ্য। তবে আমি কীভাবে উদ্ভূত ক্লাসগুলি পরীক্ষা করব? যেমন LinkedListসাবক্লাস হিসাবে List। আমি কোনও isSubclassOf(...)বা extends(...)পদ্ধতি খুঁজে পাচ্ছি না । getSuperClass()আমার কি সবার সাথে হাঁটতে হবে এবং নিজের নিজের দ্বারা আমার সুপারক্লাসগুলি সন্ধান করা দরকার?


11
LinkedListএর একটি সাবক্লাস নয় List। এটি একটি এর বাস্তবায়ন এর List
টিজে ক্রাউডার

2
সাব-টাইপটি আরও ভাল শব্দ হতে পারে
jpaugh

উত্তর:


402

আপনি এই পদ্ধতিটি চান:

boolean isList = List.class.isAssignableFrom(myClass);

যেখানে সাধারণভাবে List(উপরে) এর সাথে প্রতিস্থাপন করা উচিত superclassএবং এর সাথে প্রতিস্থাপন করা myClassউচিতsubclass

জাভাডক থেকে :

শ্রেণীর বা ইন্টারফেসটি এই Classঅবজেক্ট দ্বারা প্রতিনিধিত্ব করা হয় বা নির্দিষ্ট Classপরামিতি দ্বারা প্রতিনিধিত্ব করা শ্রেণি বা ইন্টারফেসের সুপারক্লাস বা সুপারিনটারফেস হয় কিনা তা নির্ধারণ করে । এটি trueযদি ফিরে আসে ; অন্যথায় এটি ফিরে আসে false। যদি এই Classবস্তুটি কোনও আদিম ধরণের প্রতিনিধিত্ব trueকরে, নির্দিষ্ট Classপরামিতিটি ঠিক এই Classঅবজেক্ট হলে এই পদ্ধতিটি ফিরে আসে ; অন্যথায় এটি ফিরে আসে false

রেফারেন্স:


সম্পর্কিত:

ক) সঙ্কলনের সময় আপনি কি জানেন কোনও অবজেক্ট কোনও শ্রেণি বা ইন্টারফেসের (সাবক্লাস সহ) উদাহরণ রয়েছে কিনা তা পরীক্ষা করুন:

boolean isInstance = someObject instanceof SomeTypeOrInterface;

উদাহরণ:

assertTrue(Arrays.asList("a", "b", "c") instanceof List<?>);

খ) পরীক্ষা করুন যে কোনও অবজেক্ট কোনও শ্রেণি বা ইন্টারফেসের উদাহরণ (সাবক্লাস সহ) আপনি কেবল রানটাইমে জানেন:

Class<?> typeOrInterface = // acquire class somehow
boolean isInstance = typeOrInterface.isInstance(someObject);

উদাহরণ:

public boolean checkForType(Object candidate, Class<?> type){
    return type.isInstance(candidate);
}

20
স্কিমটি নোট করুন: SUPERCLASS.isAssignableFrom(SUBCLASS)এটি প্রথমে আমাকে বিভ্রান্ত করেছে, নামকরণ বিবেচনায় আসলে এটি স্পষ্ট।
কোডপ্লেব

7
@ ট্রডলআর আমি সম্মত এর মতো কিছু SUPERCLASS.isExtendedBy(SUBCLASS)বোঝা আরও সহজ হবে
সান প্যাট্রিক ফ্লয়েড

@ সানপ্যাট্রিকফ্লয়েড আসলে isExtendedByএকটি খারাপ নাম হিসাবে CLASS.isAssignableFrom(CLASS)সত্য হবে (এবং সেইসাথেও CLASS.isExtendedBy(CLASS))। এটি আমার প্রত্যাশা মতো হবে না।
Qw3ry

@ কিউউউইরি হ্যাঁ, আমিও ধরে নিচ্ছি এপি লেখকরা যা ভেবেছিলেন :-)
সান প্যাট্রিক ফ্লয়েড

24

আরেকটি বিকল্প উদাহরণস্বরূপ:

Object o =...
if (o instanceof Number) {
  double d = ((Number)o).doubleValue(); //this cast is safe
}

শুভ কল (+1)। এবং তারপরে দুটি ব্যবস্থার সংমিশ্রণও রয়েছে: Class.isInstance(object) download.oracle.com/javase/6/docs/api/java/lang/…
শন প্যাট্রিক ফ্লয়েড

5
এটি বোঝাতে চাইবে যে আপনি তা প্রশংসনীয় করে দিন Field। তবে আমি কেবল আমার ক্লাস এবং এর ক্ষেত্রগুলি "দেখতে" চাই, "তাদের চেষ্টা করে দেখতে" চাই না।
craesh

আমি এই পদ্ধতিটি "isAignignableFrom" উপায়ের চেয়ে অনেক পরিচ্ছন্ন এবং পরিষ্কার দেখতে পাচ্ছি, যদি কোনও জিনিসের উত্তরাধিকারের গাছটি পরীক্ষা করা দরকার তবে ক্ষেত্রে।
cbuchart

মনে রাখবেন যে instanceofএটি পিতামাতার জন্যও কাজ করে (এই ক্ষেত্রে Number) কেবল শিশুরা নয়
লুকাশজ্রিগুলি

9

উদাহরণস্বরুপ কাজ করে, যেমন বস্তুগুলিতে। কখনও কখনও আপনি ক্লাস সঙ্গে সরাসরি কাজ করতে চান। এক্ষেত্রে আপনি ক্লাস শ্রেণির asSubClass পদ্ধতিটি ব্যবহার করতে পারেন । কিছু উদাহরণ:

1)

    Class o=Object.class;
    Class c=Class.forName("javax.swing.JFrame").asSubclass(o);

এটি সহজেই অতিক্রম করবে কারণ জে ফ্রেম অবজেক্টের সাবক্লাস। সিতে জেফ্রেম শ্রেণীর প্রতিনিধিত্ব করে এমন একটি শ্রেণীর অবজেক্ট থাকবে।

2)

    Class o=JButton.class;
    Class c=Class.forName("javax.swing.JFrame").asSubclass(o);

এটি একটি চালু করা হবে java.lang.ClassCastException কারণ জেফ্রেম JButton এর সাবক্লাস নয়। গ আরম্ভ করা হবে না।

3)

    Class o=Serializable.class;
    Class c=Class.forName("javax.swing.JFrame").asSubclass(o);

এটি সহজেই অতিক্রম করবে কারণ জেফ্রেমে java.io.Sriizable ইন্টারফেস প্রয়োগ করে। সিতে জেফ্রেম শ্রেণীর প্রতিনিধিত্ব করে এমন একটি শ্রেণীর অবজেক্ট থাকবে।

অবশ্যই প্রয়োজনীয় আমদানিগুলি অন্তর্ভুক্ত করতে হবে।


5

এটি আমার পক্ষে কাজ করে:

protected boolean isTypeOf(String myClass, Class<?> superClass) {
    boolean isSubclassOf = false;
    try {
        Class<?> clazz = Class.forName(myClass);
        if (!clazz.equals(superClass)) {
            clazz = clazz.getSuperclass();
            isSubclassOf = isTypeOf(clazz.getName(), superClass);
        } else {
            isSubclassOf = true;
        }

    } catch(ClassNotFoundException e) {
        /* Ignore */
    }
    return isSubclassOf;
}

1
দুর্দান্ত কাজ করে, তবে আপনি জাভা.এলং.এইজে সাবস্ক্রাইব করেন না যে সুপার ক্লাস নেই এমন ক্ষেত্রে ক্লাজ = ক্লজ.জেটসপারক্লাস () এর পরে আপনাকে একটি নাল চেক যুক্ত করতে হবে।
জোনাস পেদারসেন

4

এটি @ স্কুটটেকের উত্তরের একটি উন্নত সংস্করণ। এটি উন্নত হয়েছে কারণ এটি সঠিকভাবে আদিম (যেমন isSubclassOf (int.class, Object.class) => মিথ্যা) এর জন্য মিথ্যা প্রত্যাবর্তন করে এবং ইন্টারফেসগুলিও সঠিকভাবে পরিচালনা করে (যেমন isSubclassOf (হাশম্যাপক্লাস, ম্যাপক্লাস) => সত্য)।

static public boolean isSubclassOf(final Class<?> clazz, final Class<?> possibleSuperClass)
{
    if (clazz == null || possibleSuperClass == null)
    {
        return false;
    }
    else if (clazz.equals(possibleSuperClass))
    {
        return true;
    }
    else
    {
        final boolean isSubclass = isSubclassOf(clazz.getSuperclass(), possibleSuperClass);

        if (!isSubclass && clazz.getInterfaces() != null)
        {
            for (final Class<?> inter : clazz.getInterfaces())
            {
                if (isSubclassOf(inter, possibleSuperClass))
                {
                    return true;
                }
            }
        }

        return isSubclass;
    }
}

3

একটি Class<?>অন্যটির উপ শ্রেণি কিনা তা যাচাই করার জন্য একটি পুনরাবৃত্তি পদ্ধতি Class<?>...

উন্নত সংস্করণ @To ক্রা এর উত্তর :

protected boolean isSubclassOf(Class<?> clazz, Class<?> superClass) {
    if (superClass.equals(Object.class)) {
        // Every class is an Object.
        return true;
    }
    if (clazz.equals(superClass)) {
        return true;
    } else {
        clazz = clazz.getSuperclass();
        // every class is Object, but superClass is below Object
        if (clazz.equals(Object.class)) {
            // we've reached the top of the hierarchy, but superClass couldn't be found.
            return false;
        }
        // try the next level up the hierarchy.
        return isSubclassOf(clazz, superClass);
    }
}

3

// উত্তরাধিকার

    class A {
      int i = 10;
      public String getVal() {
        return "I'm 'A'";
      }
    }

    class B extends A {
      int j = 20;
      public String getVal() {
        return "I'm 'B'";
      }
    }

    class C extends B {
        int k = 30;
        public String getVal() {
          return "I'm 'C'";
        }
    }

// পদ্ধতি

    public static boolean isInheritedClass(Object parent, Object child) {
      if (parent == null || child == null) {
        return false;
      } else {
        return isInheritedClass(parent.getClass(), child.getClass());
      }
    }

    public static boolean isInheritedClass(Class<?> parent, Class<?> child) {
      if (parent == null || child == null) {
        return false;
      } else {
        if (parent.isAssignableFrom(child)) {
          // is child or same class
          return parent.isAssignableFrom(child.getSuperclass());
        } else {
          return false;
        }
      }
    }

// কোড পরীক্ষা করুন

    System.out.println("isInheritedClass(new A(), new B()):" + isInheritedClass(new A(), new B()));
    System.out.println("isInheritedClass(new A(), new C()):" + isInheritedClass(new A(), new C()));
    System.out.println("isInheritedClass(new A(), new A()):" + isInheritedClass(new A(), new A()));
    System.out.println("isInheritedClass(new B(), new A()):" + isInheritedClass(new B(), new A()));


    System.out.println("isInheritedClass(A.class, B.class):" + isInheritedClass(A.class, B.class));
    System.out.println("isInheritedClass(A.class, C.class):" + isInheritedClass(A.class, C.class));
    System.out.println("isInheritedClass(A.class, A.class):" + isInheritedClass(A.class, A.class));
    System.out.println("isInheritedClass(B.class, A.class):" + isInheritedClass(B.class, A.class));

//ফলাফল

    isInheritedClass(new A(), new B()):true
    isInheritedClass(new A(), new C()):true
    isInheritedClass(new A(), new A()):false
    isInheritedClass(new B(), new A()):false
    isInheritedClass(A.class, B.class):true
    isInheritedClass(A.class, C.class):true
    isInheritedClass(A.class, A.class):false
    isInheritedClass(B.class, A.class):false
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.