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

Java泛型/抽象/内部类语法问题,java,generics,Java,Generics,我有以下几点: public abstract class Foo<T>{ //contents of Foo // ... public class Bar<Q> extends Foo<T>{ //contents of Foo.Bar // ... } } 公共抽象类Foo{ //食物内容// ... 公共类Bar扩展了Foo{ //食物吧的内容// ... } } 稍后,在另一个类

我有以下几点:

public abstract class Foo<T>{
    //contents of Foo //
       ...
    public class Bar<Q> extends Foo<T>{
        //contents of Foo.Bar //
       ...
    }
}
公共抽象类Foo{
//食物内容//
...
公共类Bar扩展了Foo{
//食物吧的内容//
...
}
}
稍后,在另一个类和java文件中,我尝试构造上面的内部Bar类的一个实例,使用外部抽象类作为超类型。更复杂的是,新类有自己的泛型。以下操作不起作用:

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

     public SomeOtherClass(){
         x = Foo<A>.Bar<A>();
     }
}
public类SomeOtherClass{
私人富x,;
公共SomeOtherClass(){
x=Foo.Bar();
}
}

但这不起作用;我试过的其他组合也不一样。那么我如何实例化x呢?是否可以在不删除Foo参数的情况下完成?我不想删除Foo的参数,因为它的抽象方法在签名中有泛型参数。

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

要获得内部类的实例,首先需要外部类的实例。由于示例中的
Foo
是抽象的,因此无法实例化outerclass。因此,您也不能实例化innerclass

对于您的示例,您可以使用脏技巧(因为没有要实现的抽象方法)

public类SomeOtherClass{
私人富x,;
公共SomeOtherClass(){
//创建抽象外部类的匿名扩展
//对于真正的抽象类,这意味着您必须
//实现所有声明为抽象的方法
x=新的Foo(){};
x=x.新杆();
}
}

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

除了为了探索而进行的查询之外,在
Foo
中嵌套
Bar
的动机是什么?这看起来很像
enum
enum
的工作方式,但没有隐藏大部分奇怪之处的幕后编译器魔法

如果
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>();
    }
}