2014-12-30 46 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) {} 
} 

目前,还没有办法从同一类调用不同的背景,不同的超级构造。尽管如此,它将在未来几个月得到支持。