2014-12-30 48 views
23

我正在學習Kotlin的過程中,遇到了一個我無法弄清楚的問題。 我想在Kotlin中擴展Java類的RuntimeException,並且能夠在不同的情況下使用它的三個構造函數中的任何一個(根據我當時想要拋出異常的信息)。在java中我的課是這樣的:在Kotlin中,如何擴展具有多個構造函數的類?

public class PhotoLibException extends RuntimeException { 

    public PhotoLibException(String message, RuntimeException ex) { 
     super(message, ex); 
    } 

    public PhotoLibException(String message) { 
     super(message); 
    } 

    public PhotoLibException(RuntimeException ex) { 
     super(ex); 
    } 
} 

當我嘗試這樣做在科特林,我用這個答案作爲指導:Kotlin secondary constructor不過,我有一個問題,試圖找出如何調用相應的超構造函數正確。例如,使用功能似乎是一個好辦法,這樣的:

fun PhotoLibException(message: String): PhotoLibException { 
    val ex = null 
    return PhotoLibException(message, ex) 
} 

fun PhotoLibException(ex: Exception): PhotoLibException { 
    val message = "" 
    return PhotoLibException(message, ex) 
} 

class PhotoLibException(message: String, ex: Exception?): RuntimeException(message, ex) { 
} 

然而,在上面這個科特林例子,我總是調用超構造函數有兩個參數,而不是調用最合適的構造情況。所以我上面有什麼工作,但並沒有做到它在Java中會做什麼,在每種情況下調用不同的構造函數。 我也嘗試在上面的每個樂趣裏面實例化一個新的RuntimeException,並將其轉換爲PhotoLibException,但我沒有被允許這樣做。

任何人都可以建議我怎麼會在Kotlin中正確地做到這一點?

回答

49

更新:由於M11(0.11 *),你可以使用secondary constructors來解決這個問題:

class PhotoLibException : RuntimeException { 
    constructor(message: String, ex: Exception?): super(message, ex) {} 
    constructor(message: String): super(message) {} 
    constructor(ex: Exception): super(ex) {} 
} 

目前,還沒有辦法從同一類調用不同的背景,不同的超級構造。儘管如此,它將在未來幾個月得到支持。