Как получить класс владельца свойства в Java? - PullRequest
0 голосов
/ 13 мая 2019

Если у меня есть что-то вроде

public class OwnerClass1{

   public class OwnedClass{
      // definition 1
   }

}

public class OwnerClass2{

   public class OwnedClass{
      // definition 2
   }

}

Из функции, которая реализована, как показано ниже:

public <OwnedClass> boolean doStuff(OwnedClass example) {
   System.out.println(example.<???>);
   // example.getClass() returns "OwnerClass1$OwnedClass" etc here, so I guess getting this to string and trimming after $ would be one solution
   // example.getSuperClass() returns "java.lang.Object" here, so not what I need
}

Как я могу получить поведение, как показано ниже:

doStuff(new OwnerClass1.OwnedClass());
// OwnerClass1

doStuff(new OwnerClass2.OwnedClass());
// OwnerClass2

Примечание: Код выше предназначен для того, чтобы дать приблизительное представление о структуре, а не составлять ее из коробки.

Ответы [ 3 ]

2 голосов
/ 13 мая 2019

Я понимаю, что вы хотите, чтобы ваш уникальный метод doStuff действовал по-разному в зависимости от класса от фактического класса параметра, который вы передаете ему.

Чтобы это было возможно, OwnedClass1 и OwnedClass2 должны расширять общий класс или интерфейс (который, я полагаю, вы называете OwnedClass).В противном случае ваш doStuff должен будет принять Object в качестве параметра.

Тогда вы можете использовать instanceof для дифференциации классов.

Пример с объектом:

public boolean doStuff(Object example) {
    if (example instanceof OwnedClass1) {
       System.out.println("this is a class 1!");
    } else if (example instanceof OwnedClass2) {
       System.out.println("this is a class 2!");
    } else {
       throw new RuntimeException("Not supported : " + example.getClass());
    }
}

А если вас интересует только краткое название класса, то вы можете пойти так:

public boolean doStuff(Object example) {    
       System.out.println("this is a " + example.getClass().getName());
}

или даже

public boolean doStuff(Object example) {    
       System.out.println("this is a " + example.getClass().getName().replaceAll(".*\\.", ""));
}

HTH!

1 голос
/ 13 мая 2019

OwnedClass не расширяет OwnerClass1, он только расширяет класс Object. Скорее всего, вы ищете getEnclosingClass() метод вместо getSuperClass().

public boolean doStuff(Object example) {
   System.out.println(example.getClass().getEnclosingClass());
}
1 голос
/ 13 мая 2019

Оба подкласса OwnedClass могут наследовать от другого класса, который вы передаете doStuff.

public class OwnerClass1 {

    public class OwnedClass  extends SuperOwnedClass {
        // definition 1
    }

}

public class OwnerClass2 {

    public class OwnedClass extends SuperOwnedClass {
        // definition 2
    }

}

public class SuperOwnedClass {

}

public boolean doStuff(SuperOwnedClass example) {
    System.out.println(example.<???>);
}

Или, что еще лучше, позвольте им реализовать интерфейсы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...