2016-08-11 60 views
0

我想創建一個類似「android.view.View」的類,它將顯示「There is no default default constructor available in'android.view.View'」error if super (...)在課堂上不叫我的班級,抱歉我的英語不好,有沒有人可以幫助我?感謝如何創建沒有默認構造函數的類

--edit

@Eran,謝謝,您的評論給了我一個提示,所以罪魁禍首是龍目島標註「@Data」,它甚至沒有給出錯誤我創建一個參數的構造函數,任何想法如何與龍目島實現這一目標?

+1

創建具有參數的構造函數的類。 – Eran

+0

只需添加一個帶有至少一個參數的構造函數即可。如果你沒有在類中定義任何構造函數,編譯器只會添加一個默認構造函數。 – Jesper

+0

@Eran,謝謝,你的評論給了我一個提示,所以罪魁禍首是Lombok註釋「@Data」,即使我創建一個帶參數的構造函數,也不會出錯,任何想法如何用Lombok實現? – g03r03

回答

0

我只是提供了私有的構造函數:

public class MyClass { 
    private MyClass() { 
     throw new UnsupportedOperationException(); 
    } 
} 
+0

這是現在最好的答案,這隻能在運行時顯示異常,但未經過測試,如果可能,我想在編譯之前生成錯誤 – g03r03

0

這是您的主要類模式。

public class MyParentClass { 

    MyParentClass(int value) { 

    } 
} 

如果任何類想要它,而無需調用super(value)將得到延長「有一個在parent_class_name沒有默認的構造器可用」

像如下:

public class ChildClass extends MyParentClass { 

} 
+0

是的,這是我如何創建我的課程,我認爲我犯了錯誤,但後來我終於意識到,如果我使用來自龍目島的「@Data」註釋,這個類別不會產生任何錯誤 public @Data class ChildClass擴展MyParentClass { } – g03r03

1

你可以把它私人所以其他類不能使用它。

public class MyClass{ 
    private String text; 
    private int number; 

    private MyClass(){ 
     this.text="hi"; 
    } 

    public MyClass(int number){ 
     this(); 
     this.number = number 
    } 
    ... 
} 

這樣,子類應使用非默認的構造函數:

public MyChildClass1 extends MyClass{ 
    //NO COMPILE: No default constructor available in MyClass 
} 

public MyChildClass2 extends MyClass{ 
    public MyChildClass2(){ 
     //NO COMPILE: No default constructor available in MyClass 
    } 
} 

public MyChildClass3 extends MyClass{ 
    public MyChildClass3(){ 
     super(); //NO COMPILE: MyClass() has private access 
    } 
} 

public MyChildClass4 extends MyClass{ 
    public MyChildClass4(){ 
     super(2); //It Works! (it will initialize number=2 and text="hi") 
    } 
} 
+0

私人字段如何強制子類至少使用一個超級(..)? – g03r03

+0

@ g03r03我不確定我是否瞭解您的評論。我已經更新了我認爲你所要求的答案。 – debus

相關問題