[英]Why can't object of nested class be used as a parameter of supertype constructor?
我有如下代碼:
class A {
final Object data;
A(Object _data) {
data = _data;
}
class B extends A {
B() {
super(new C());
}
class C { }
}
}
我收到以下錯誤消息:
Cannot reference 'C' before supertype constructor has been called
我不明白為什么這不可能。
有什么解決方法嗎? 我希望data
是最終的,類要像上面的代碼中那樣嵌套(我不想為每個類創建一個不同的文件,因為類很小,而在我的實際代碼中,它們對它們來說更合邏輯嵌套)
使用簡單的嵌套類,就可以了。 但是,你要創建一個內部類的B
,這意味着你隱式傳遞一個參考的實例B
-這將是this
在這種情況下,你不能使用this
之前super(...)
完成。
這是另一個示例-閱讀評論:
class Base {
Base(Object x) {}
}
class Outer extends Base {
Outer() {
super(new Nested()); // No problem
}
Outer(int ignored) {
super(new Inner()); // Effectively this.new Inner()
}
Outer(boolean ignored) {
super(new Outer().new Inner()); // Fine
}
Outer(long ignored) {
super(new Nested(this)); // Explicitly passing this
}
static class Nested {
Nested() {}
Nested(Object ignored) {}
}
class Inner {
}
}
問題在於,非靜態內部類在實例化之前需要外部類的實例。 這就是為什么您甚至可以直接在內部類中訪問外部類的字段的原因。
使內部類static
,並且應該可以工作。 通常,使用靜態內部類而不是非靜態內部類是一個很好的模式。 有關更多信息,請參見Joshua Bloch的Effective Java項目22。
class A {
final Object data;
A(final Object _data) {
data = _data;
}
static class B extends A {
B() {
super(new C());
}
static class C {
}
}
}
您好,抱歉無法發表評論。
我不想為每個類創建一個不同的文件,因為類很小
我有一位教授總是說: “永遠不會有太小的班級,只有太大的班級”
如果您堅持並仍然希望嵌套類,則可以根據您的目的將C類靜態化。 但我強烈建議您質疑您的設計。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.