У меня есть базовый класс с абстрактным методом getType (). Я хочу, чтобы подклассы могли реализовывать этот метод и предоставлять фактический класс для использования.
В коде что-то вроде следующего:
public abstract class A {
public static interface Tile;
protected abstract Class<Tile> getTileClass();
}
public class B extends A {
public static class MyTile implements A.Tile { }
@Override
protected abstract Class<A.Tile> getTileClass() {
MyTile t = new MyTile(); // WORKS
return MyTile; // ERROR HERE
}
}
Проблема здесь в том, что я получаю «MyTile не может быть решен» в строке, помеченной. Поэтому я пытаюсь вернуть это вместо:
вернуть новый MyTile (). GetClass ()
но теперь Затмение говорит мне:
Несоответствие типов: невозможно преобразовать из
Класс <
Захват № 1-из? расширяет B.MyTile >
в класс <
A.Tile >
что я даже не уверен, есть ли ошибка в Eclipse здесь вверху (захват # 1?).
Далее я отказываюсь от интерфейсов и пытаюсь использовать абстрактный базовый класс Tile. С некоторой помощью Eclipse я получаю следующий код, который, кажется, компилируется:
public abstract class A {
public static abstract class Tile;
protected abstract Class<? extends Tile> getTileClass();
}
public class B extends A {
public static class MyTile exends A.Tile { }
@Override
protected abstract Class<? extends A.Tile> getTileClass() {
return new MyTile().getClass(); // WORKS
return MyTile; // "Cannot be resolved"
}
}
Так что у меня, по-видимому, три вопроса:
1) Можно ли заставить это работать с A.Tile как с интерфейсом?
2) При использовании базового класса Class<? extends X>
действительно правильный путь?
3) И как я могу вернуть мою вложенную ссылку на класс B.MyTile изнутри метода? Необходимость сделать new MyTile().getClass()
не может быть правильной, не так ли?