覆盖嵌套在Java中的参数化外部类中的非参数化类

时间:2012-02-25 20:15:42

标签: 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) { ... }

}

有人可以帮我解决这个问题吗?感谢。

3 个答案:

答案 0 :(得分:0)

您的问题是嵌套类是非静态的。我会检查出来,但我非常确定你不能将这些类子类化,除非是嵌套在同一个类中,或者在创建匿名类型时。

声明嵌套类是否可行?他们肯定会工作。

编辑:抓住所有这些。我没有编译错误。您的案件中S是什么?您确实意识到必须将具体类传递给Foo,并且不能使用未知参数S对其进行参数化?

答案 1 :(得分:0)

如果ConcreteBaz需要引用type参数,那意味着它需要type参数本身:

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

答案 2 :(得分:0)

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) {
        // ...
    }
}