2015-04-16 4 views
3

Я пытаюсь получить objects от user1 когда toString() запускается внутри user2, но когда я использую super это относится к Object вместо user1. Думаю, мне, возможно, придется использовать отражение, но я не уверен. Как я могу получить super.objects.get(0) за user1, когда у ребенка, user2?получить родительский экземпляр во время выполнения

public abstract class Foo { 

    public List<Object> objects = new ArrayList<>(); 

    public void add(String string) { 
     objects.add(string); 
    } 

    @Override 
    public String toString() { 
     //This line is broken: 
     Object object = super.objects.get(0); 
    } 

} 

>

public class User extends Foo {} 

>

public static void main(String args[]) { 
    User user1 = new User(); 
    User user2 = new User(); 
    user1.add(user2); 
    user2.toString(); 
} 

ответ

0

Линия работает правильно, так как Foo не имеет суперкласса объявлен и, таким образом неявно подклассов Object

Если вы хотите использовать objects, хранящийся в Foo вы можете просто получить доступ к нему, как Object object = objects.get(0);

+0

'objects.get (0);' получает 'этот' 'объект'. Я пытаюсь получить 'super'' object' – Glo

+1

Нет объекта 'super ', поскольку вы пытаетесь получить его в' Foo', который, как упоминалось, имеет «Object» как суперкласс. Точка, в которой вы, возможно, захотите использовать 'super', будет находиться в' User', но поскольку 'objects' является' public', вам там даже не понадобится. – Dragondraikk

2

Если objects поле public (плохая практика!), protected или пакет защищен (без явного модификатора доступа), ваш ребенок классов смогут получить к нему доступ напрямую (если в пределах тот же пакет для последнего случая).

super вызов из Foo возвращает экземпляр Object, потому что Foo в явном виде не распространяется любой класс, следовательно, он расширяет Object.

Вам нужно только реализовать toString() переопределение в return String.valueOf(objects) или String.valueOf(objects.get(myIndex)) - проверить пустой/null во втором случае.

Метод будет динамически разрешен во время выполнения и может быть вызван из экземпляров User, представляющий objects или любой объект, индексированный.

Вот простой автономный пример, который выводит всю коллекцию:

public class Main { 

    public static void main(String[] args) { 
     System.out.println(new Bar()); 
    } 
    static class Foo { 
     // package-protected field. A Bar instance will have access here. 
     List<Object> objects; 
     @Override 
     public String toString() { 
      // printing representation of "objects" and avoiding NPE 
      return String.valueOf(objects); 
     } 
    } 
    static class Bar extends Foo { 
     // overriding default constructor and initializing/populating "objects" 
     Bar() { 
      objects = new ArrayList<Object>(); 
      objects.add(1); 
     } 
    } 
} 

Это будет распечатать [1].

Побочное примечание

Кроме того, метод, возвращающий String должен фактически вернуть String. Какой ваш toString переопределить нет.

Смежные вопросы