我有以下内容:
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的参数,因为它的抽象方法在其签名中都有通用参数。
答案 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
的动机是什么?这看起来几乎与enum
和Enum
的工作方式相似,但没有幕后编译器魔法来隐藏大部分奇怪的东西。
如果Foo
不完整,则意味着从远处延伸 - 即使只是在其包含的包内(如果该类未被公开)。嵌套在不完整外壳中的扩展只会混淆潜在客户。
如果您分享有关实际问题域的更多详细信息,您可能会召集大量有关如何更好地建模解决方案的具体回复。
答案 2 :(得分:-1)
Bar是Foo的非静态内部类。这意味着你需要一个Foo实例来构造一个Bar实例。如果你不想要一个Foo实例,那么Bar应该成为一个静态的内部类。