Наследование Java и дженерики - PullRequest
1 голос
/ 07 апреля 2011

Я пытаюсь расширить абстрактный класс с помощью шаблонов, и у меня возникает проблема:

abstract public class SomeClassA<S extends Stuff> {
  protected ArrayList<S> array;

  public SomeClassA(S s) {
    // ...
  }

  public void someMethod() {
    // Some method using the ArrayList
  }

  abstract public void anotherMethod() {
    // ... 
  }
}

Теперь я хочу расширить этот класс другим абстрактным классом, чтобы я мог переопределить «someMethod». Я попробовал:

abstract public class SomeClassB<Z extends Stuff> extends SomeClassA {

  public SomeClassB(Z z) {
    super(z);
  }

  @Override public void someMethod() {
    // Some method using the ArrayList
  }

}

NetBeans не видит никаких проблем с конструктором, но я не могу использовать ArrayList из SomeClassA в методе someMethod. Итак, я попробовал:

abstract public class SomeClassB<Z extends Stuff> extends SomeClassA<S extends Stuff> {

  public SomeClassB(Z z) {
    super(z);
  }

  @Override public void someMethod() {
    // Some method using the ArrayList
  }

}

А сейчас это очень странно. Кажется, все работает (и теперь я могу использовать arraylist, но NetBeans говорит, что в объявлении SomeClassB есть «ожидаемый», и он просто не будет компилироваться. Если возможно, я бы хотел:

  1. Чтобы узнать, как решить эту конкретную проблему.

  2. Хорошая справка по пониманию дженериков.

  3. Чтобы узнать, проще ли в C #.

Ответы [ 2 ]

10 голосов
/ 07 апреля 2011

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

abstract public class SomeClassB<Z extends Stuff> extends SomeClassA<Z>

Ваш суперкласс и подкласс будут оба использовать один и тот же универсальный тип.Универсальные типы не наследуются подклассами и не передаются суперклассам.

2 голосов
/ 07 апреля 2011

Чтобы получить представление об общих принципах, ознакомьтесь с Effective Java, 2nd Edition .

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