Java泛型/抽象/内部类语法问题

时间:2009-11-20 22:37:56

标签: java generics

我有以下内容:

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的参数,因为它的抽象方法在其签名中都有通用参数。

3 个答案:

答案 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>();
    }
}

实际上,如果你需要访问抽象类(Bar)的内部类(Foo)而不需要封闭类,那么你应该问问自己你的类结构是否正确。

答案 1 :(得分:0)

除了探索探索之外,在Bar内嵌套Foo的动机是什么?这看起来几乎与enumEnum的工作方式相似,但没有幕后编译器魔法来隐藏大部分奇怪的东西。

如果Foo不完整,则意味着从远处延伸 - 即使只是在其包含的包内(如果该类未被公开)。嵌套在不完整外壳中的扩展只会混淆潜在客户。

如果您分享有关实际问题域的更多详细信息,您可能会召集大量有关如何更好地建模解决方案的具体回复。

答案 2 :(得分:-1)

Bar是Foo的非静态内部类。这意味着你需要一个Foo实例来构造一个Bar实例。如果你不想要一个Foo实例,那么Bar应该成为一个静态的内部类。