у подкласса Java есть метод, чтобы возвратить его класс - PullRequest
3 голосов
/ 13 октября 2010

Хорошо, возможно, это глупый вопрос.Но мне просто интересно, можно ли это сделать в Java.

abstract public class ParentClass<T> { 
  abstract public T getTest();
}

в подклассе

public class SubClass extends ParentClass<MyObject> {
  public MyObject getTest() {
    // I can return the object with class MyObject
    return null;
  }
}

Мой вопрос: могу ли я вернуть тип класса в дочернем методе?Я имею в виду, это может быть сделано путем добавления некоторого кода в ParentClass, чтобы я мог сделать это ниже?

Например

public class Sub1Class extends parentClass<Object1> {
  public Object1 getTest() { }
  // I want to have a method that return it's class in the superclass
  public Sub1Class getItClassObject() { }
}

другой пример

public class Sub2Class extends parentClass<Object2> {
  public Object2 getTest() { }
  // I want to have a method that return it's class in the superclass
  public Sub2Class getItClassObject() { }
}

снова один пример

public class Sub3Class extends parentClass<Object3> {
  public Object3 getTest() { }
  // I want to have a method that return it's class in the superclass
  public Sub3Class getItClassObject() { }
}

если вы видите, метод getItClassObject в Sub1Class, Sub2Class и Sub3Class будет следовать его классу.Но я не хочу добавлять один и тот же метод для каждого подкласса, просто хочу добавить некоторый код (если это возможно) в ParentClasss, поэтому в подклассе я могу просто напрямую вызывать getItClassObject без записи всего кода в каждом подклассе.

Обычно я добавляю метод в ParentClass следующим образом.

abstract public class ParentClass<T> {
  abstract public T getTest();
  public Object getItClassObject() { }
}

, поэтому в подклассе я просто создаю экземпляр класса, но мне приходится снова приводить: (

Sub1Class sub1Class = new Sub1Class();
Sub1Class after1Cast = (Sub1Class) sub1Class.getItClassObject();

Sub2Class sub2Class = new Sub2Class();
Sub2Class after2Cast = (Sub2Class) sub2Class.getItClassObject();

Iдумаю, что это не может быть сделано в Java. Но я не знаю, есть ли ключ, чтобы решить эту проблему. Спасибо

Ответы [ 4 ]

3 голосов
/ 13 октября 2010

Это то, что вы хотите, я думаю. Следующие компиляции:

abstract class A {
    public abstract A getA();
}

class B extends A {
    // Declared to return a B, but it still properly overrides A's method
    @Override
    public B getA() {
        return new B();
    }
}

class C extends A {
    // Declared to return a B, but it still properly overrides A's method
    @Override
    public C getA() {
        return new C();
    }
}

Как видите, A объявляет, что метод getA() возвращает A. Но вы можете ограничить тип возвращаемого значения в подклассах, как показано.

1 голос
/ 19 апреля 2011

Единственный способ, о котором я могу думать, это сказать родительскому классу, что это за подкласс, когда вы расширяете его (так же, как вы делали с 'T'). Например:

public abstract class ParentClass<T,U> { 
    abstract public T getTest();
    abstract public U getItClassObject();
}

Они определяют ваш подкласс следующим образом:

public class Sub1Class extends ParentClass<Object1,Sub1Class> {
    public Object1 getTest() { }
    public Sub1Class getItClassObject() { }
}

Тогда вы можете делать то, что вы хотите, без typecast:

Sub1Class sub1Class = new Sub1Class();
Sub1Class after1Cast = sub1Class.getItClassObject();
1 голос
/ 14 октября 2010

Я не уверен, правильно ли я понимаю ваше намерение, но я думаю, что встроенный метод Object.getClass () сделает то, что вы хотите. Данные классы определены как:

public abstract class ParentClass<T> {
  public abstract T getTest();
}

class SubClassString extends ParentClass<String> {
   public String getTest() {
      return "";
   }
}

class SubClassInteger extends ParentClass<Integer> {
   public Integer getTest() {
      return Integer.valueOf(0);
   }
}

getClass () вернет правильный класс времени выполнения

  public static void main(String[] args) {
      SubClassString subString = new SubClassString();
      // displays "class SubClassString"
      System.out.println(subString.getClass()); 

      SubClassInteger subInteger = new SubClassInteger();
      // displays "class SubClassInteger"
      System.out.println(subInteger.getClass());

      ParentClass<?> parentInstance = new SubClassInteger();
      // displays "class SubClassInteger"
      System.out.println(parentInstance.getClass());  
  }
0 голосов
/ 13 октября 2010

Если ваши объекты имеют конструкторы без аргументов (или некоторую согласованную форму конструктора для всех них), вы можете использовать рефлексию для этого. Какой-то псевдокод будет

public class MyClass {

    public MyClass instantiateType() {
       Class<?> actualClass = getClass();
       return actualClass.newInstance();
    }

}

Это использует тип времени выполнения класса, поэтому подклассы будут возвращать их тип. Это работает только для конструктора без аргументов.

...