class Bouncy<T> extends Throwable {
}
// Error: the generic class Bouncy<T> may not subclass java.lang.Throwable
Run Code Online (Sandbox Code Playgroud)
为什么Java不支持泛型Throwable?
我意识到类型擦除使某些事情变得复杂,但显然Java已经经历了很多,所以为什么不再推动它,并允许泛型Throwables,通过全面的编译时检查潜在的问题?
我觉得类型擦除论证相当薄弱.目前,我们做不到:
void process(List<String> list) {
}
void process(List<Integer> list) {
}
Run Code Online (Sandbox Code Playgroud)
当然,我们没有它.我不要求,我们应该能够做到catch Bouncy<T1>,并Bouncy<T2>在同一个try块,但是如果我们使用他们在严格的编译时可执行的规则不相交的上下文(这是相当多的仿制药的工作方式现在),你说对不对可行吗?
我定义了以下函数:
inline fun <T> T.tryTo(block: T.() -> Unit): T? {
try {
block()
} catch (ex: IllegalArgumentException) {
return this
}
return null
}
Run Code Online (Sandbox Code Playgroud)
目的是在对象上构建一系列尝试操作,例如:
val input: String = getInput();
input.tryTo /* treat as a file name and open the file */ {
Desktop.getDesktop().open(File(this))
}?.tryTo /* treat as a number */ {
try {
doSomethingWithTheNumber(parseInt(this))
} catch (ex: NumberFormatException) {
throw IllegalArgumentException()
}
}?.tryTo {
println("All options tried, none worked out. Don't know how to treat this input.")
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,效果很好。 …
我知道我不能在Java中抛出或捕获泛型类的实例,例如,下面的代码编译错误:
public static <T extends Throwable> void test(Class<T> t){
try{
//do work
}
catch (T e){// ERROR--can't catch type variable
Logger.global.info(...)
}
}
Run Code Online (Sandbox Code Playgroud)
有人能解释Java禁止抛出或捕获泛型类实例的确切原因吗?