2012-02-25 2 views
2

Может ли кто-нибудь помочь с синтаксисом подкласса непараметризированного вложенного класса внутри параметризованного внешнего класса, например, следующим образом?Переопределение непараметризированных классов, вложенных в параметризованный внешний класс в Java

public abstract class Foo<T> { 

    public class Bar { 
     Set<T> aSet; 
    } 

    abstract class Baz { 
     abstract void doSomething(Map<? extends Bar, T> aMap); 
    } 
} 

Затем в отдельном файле, я не совсем уверен, как определить тип переменной S здесь без параметрирования ConcreteBaz. И я не могу использовать подстановочные переменную как extends Foo<?>.Baz (я думаю), потому что мне нужен доступ к этой общей переменной типа в методе doSomething:

public class ConcreteBaz extends Foo<S>.Baz { // compilation error 

    public ConcreteBaz(Foo<S> foo) { foo.super(); } 

    public void doSomething(Map<? extends Foo<S>.Bar, S> aMap) { ... } 

} 

Может кто-то пожалуйста, помогите мне понять, как обойти это? Благодарю.

ответ

0

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

Является ли объявление вложенного класса статичным? Их это определенно сработает.

Редактировать: поцарапать все это. У меня нет ошибки компиляции. Что такое S в вашем случае? Вы понимаете, что вам нужно передать конкретный класс в Foo и не оставить его параметризованным с неизвестным параметром S?

0

Если ConcreteBaz потребности обратиться к параметру типа, что означает, что он должен сам параметр типа:

public class ConcreteBaz<S> extends Foo<S>.Baz { 
+0

Вы можете поставить экземпляр для ограждающих 'Foo' конструктору см мой пример (я пробовал в IDE). – Jesper

+0

Вы пробовали то, что вы объясняете, как невозможное? – Irfy

+0

@Jesper: Упс, спасибо. Я удалил эту часть своего ответа. – ruakh

0

Declare S в качестве параметра типа:

public class ConcreteBaz<S> extends Foo<S>.Baz { 

В противном случае компилятор будет думать S - это конкретный тип вместо параметра типа.

Полный пример:

public class ConcreteBaz<S> extends Foo<S>.Baz { 
    public ConcreteBaz(Foo<S> foo) { 
     foo.super(); 
    } 

    @Override 
    void doSomething(Map<? extends Foo<S>.Bar, S> aMap) { 
     // ... 
    } 
} 
Смежные вопросы