2009-11-20 5 views
0

я получил следующее:Java дженериков/аннотация/InnerClass синтаксис вопрос

public abstract class Foo<T>{ 
    //contents of Foo // 
     ... 
    public class Bar<Q> extends Foo<T>{ 
     //contents of Foo.Bar // 
     ... 
    } 
} 

Позже, в другом классе и Java файл, я пытаюсь построить экземпляр внутреннего класса Bar выше, используя внешний абстрактный класс как супертип. Чтобы еще больше усложнить ситуацию, новый класс имеет свой собственный родовой характер. Не работает:

public class SomeOtherClass<A>{ 
    private Foo<A> x; 

    public SomeOtherClass(){ 
     x = Foo<A>.Bar<A>(); 
    } 
} 

Но это не сработает; и не все остальные комбо, которые я пробовал. Итак, как мне создать экземпляр x? Можно ли это сделать, если не удалить параметр Foo? Я не хочу удалять параметр Foo, потому что абстрактные методы имеют общий параметр в своих подписях.

+0

Я не понимал, что есть место, чтобы принять лучший ответ. Прости! – Jay

+0

не забывайте использовать статические вложенные классы вместо внутренних классов, когда это возможно, и наблюдайте, как большинство странных запутанных проблем просто исчезают. –

ответ

3

Чтобы получить экземпляр внутреннего класса, вам сначала понадобится экземпляр внешнего класса. Поскольку Foo в вашем примере является абстрактным, вы не можете создать экземпляр внешнего класса. Таким образом, вы также не можете создать экземпляр внутреннего класса.

Для примера вы можете использовать подвох (как нет абстрактных методов реализации)

public class SomeOtherClass<A>{ 
    private Foo<A> x; 
    public SomeOtherClass() { 
     //create anonymous extension of the abstract outer class 
     //for a real abstract class this would mean you have to 
     //implement all methods which are declared abstract 
     x = new Foo<A>(){}; 
     x = x.new Bar<A>(); 
    } 
} 

Так на самом деле вы должны спросить себя, если ваша структура класса является правильной, если вам нужен доступ к InnerClass (Bar) абстрактного класса (Foo), не требуя особого класса.

+0

Спасибо. Это умный трюк. Я думаю, что я просто ленился со своими внутренними классами. – Jay

-1

Бар - нестатический внутренний класс Foo. Это означает, что вам нужен экземпляр Foo для создания экземпляра Bar. Если вам не нужен экземпляр Foo, тогда Bar должен быть сделан статическим внутренним классом.

+1

Не работает, поскольку Foo является абстрактным и не может быть создан – jitter

+0

Спасибо! Это то, что я думал. – Jay

+1

Странно, что этот ответ прав, вплоть до фрагмента кода, который делает что-то совершенно другое, и неправильно. –

0

Помимо запроса на разведку, каков мотив для гнездования Bar в пределах Foo? Это почти похоже на то, как работают enum и Enum, но без волшебства компилятора за кадром, чтобы скрыть большинство странностей.

Если Foo является неполным, он должен быть расширен издалека - даже если он находится не дальше, чем внутри его содержащего пакета (если класс не был объявлен публичным). Расширения, вложенные в неполную шелуху, только путают потенциальных клиентов.

Если вы сообщаете более подробную информацию о реальном проблемном домене, вы, вероятно, вызовите множество конкретных ответов о том, как лучше моделировать решение.

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