gpt4 book ai didi

generics - 使用泛型的Scala异常签名定义

转载 作者:行者123 更新时间:2023-12-03 12:28:20 24 4
gpt4 key购买 nike

我想使用泛型来定义给定方法抛出的业务异常(scala 方法将从 Java 调用,因此它必须在签名中)。

这是我在 Java 中的做法:

public interface BaseInterface<T, E extends Throwable> {
public T process(Class<E> wrapperExc) throws E;
}

public class ExcOne extends Exception {}

public class SubclassOne implements BaseInterface<String, ExcOne> {
@Override
public String process(Class<ExcOne> wrapperExc) throws ExcOne {
return null;
}
}

这是我在 Scala 中的尝试:
class UsingGenerics[IN, OUT, E <: Throwable] {

//@throws(classOf[E]) - error: class type required but E found
def process(request: IN, wrapperExc: Class[E]): OUT = {
null.asInstanceOf[OUT]
}

}

和..
trait BaseTrait {

type Request
type Response
type BusinessException <: Throwable

//error: class type required but BaseTrait.this.BusinessException found
//@throws(classOf[BusinessException])
def process(request: Request): Response

}

class TraitImplementor extends BaseTrait {

type Request = Input
type Response = Output
type BusinessException = BizExc

def process(r: Request): Response = {
if (1 != 2) throw new BusinessException("Bang")
new Response
}

}

class Input
class Output
class BizExc(msg: String) extends Exception(msg)

Scala 代码中的两条注释行都无法编译。

如果有人能解释如何进行这项工作,我将不胜感激。

对我来说,'throw new BusinessException("Bang")' 表示类型别名 'BusinessException' 是一个编译时文字,因此我希望它可以与 classOf 一起使用。

如果事实证明它无法完成,我也很感激有关类型系统发生了什么或相对于类型替换处理注释的顺序的任何见解。

最佳答案

实际上,在java中注释也是一样的。
如果创建注释

public @interface Throwing { Class<? extends Throwable> exceptionType(); }

你可以做 throwing{exceptionType = RuntimeException.class}但不是 throwing{exceptionType = E.class} .你不能做 E.class在 java 中也不是 classOf[E]在斯卡拉。

您不能在注释中放置类型参数。问题是在 Scala @throws 中是注解,遵循注解规则,但JVM上的throws规则不同。也许需要特殊情况。

关于generics - 使用泛型的Scala异常签名定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7848576/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com