2009-11-20 66 views
0

我有以下几点:Java泛型/抽象/内部类的语法问题

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

后来,在另一个类和java文件,我试图构建上述内酒吧类的实例,使用外部抽象类作为超类型。让事情更复杂的是,新班级有它自己的通用性。以下不起作用:

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

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

但这不起作用;而且我所尝试过的所有其他组合也不做。那么我怎么去实例化x?除去Foo的参数可以完成吗?我不想删除Foo的参数,因为它的抽象方法在它们的签名中有通用参数。

+0

我没有意识到有一个地方可以接受最好的答案。对不起! – Jay 2009-11-20 22:49:46

+0

记得尽可能使用静态嵌套类而不是内部类,并且观察大部分奇怪的混淆问题就会消失。 – 2009-11-20 23:37:54

回答

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),而不需要封闭类。

+0

谢谢。这是一个聪明的伎俩。我认为我只是懒惰的内心阶层。 – Jay 2009-11-20 22:59:33

-1

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

+1

由于Foo是抽象的,不能实例化 – jitter 2009-11-20 22:51:31

+0

谢谢!这是我的想法。 – Jay 2009-11-20 22:51:56

+1

奇怪的是,这个答案是正确的,直到代码片断正在做一些完全不同的事情,并且是错误的。 – 2009-11-20 23:03:57

0

除了探索的缘故,嵌套的动机BarFoo以内的动机是什么?这看起来像enumEnum如何工作,但没有幕后的编译器魔法来隐藏大部分的怪异。

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

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