Java 如何正确地泛化此类以避免未检查的警告?
我有一个小小的类,它提供了一个包装器,可以抛出一个异常并返回一个javaslang 2.05(按照惯例,Java 如何正确地泛化此类以避免未检查的警告?,java,generics,Java,Generics,我有一个小小的类,它提供了一个包装器,可以抛出一个异常并返回一个javaslang 2.05(按照惯例,left中有一个失败,而right中有一个正常结果。任何一个都只能是其中之一) 公共类EitherWrapper{ 公共静态或换行(可调用可调用){ 试一试{ 返回.right(callable.call()); }捕获(例外e){ 返回(或)或。左(e); } } } Javadoc forone.leftat 问题是javac标志返回(或)other.left(e)作为未经检查的强制转换
left
中有一个失败,而right
中有一个正常结果。任何一个都只能是其中之一)
公共类EitherWrapper{
公共静态或换行(可调用可调用){
试一试{
返回.right(callable.call());
}捕获(例外e){
返回(或)或。左(e);
}
}
}
Javadoc forone.left
at
问题是javac标志返回(或)other.left(e)代码>作为未经检查的强制转换(正如javac认为它也是一样公平),但我真的很想正确地修复它,而不是仅仅强制转换它。我应该如何重写此类以消除警告?使用来解析正确部分的类型:
return Either.<E, R>left(e);
返回其中一个。左(e);
问题是,您也将挂起。不管怎样,将置于异常状态,因此您没有实现泛型所允许的通用性
始终将其固定到异常
,并具有以下特性:
public static <R> Either<Exception, R> wrap(Callable<R> callable) {
try {
return Either.right(callable.call());
} catch (Exception e) {
return Either.left(e);
}
}
publicstaticorywrap(Callable-Callable){
试一试{
返回.right(callable.call());
}捕获(例外e){
返回其中一个。左(e);
}
}
因为已知或包装了异常
我只想做:
class EitherWrapper {
public static <R> Either<Exception, R> wrap(final Callable<R> callable) {
try {
return Either.right(callable.call());
} catch (final Exception ex) {
return Either.left(ex);
}
}
}
这会导致编译错误-“error:(18,38)java:不兼容的类型:java.lang.Exception无法转换为E
”,因为call()
会引发异常。建议?您可以尝试返回其中一个。左(e)代码>你测试过你的建议吗?不,我不是Java专家,但在C语言中,我们可以在泛型类上调用静态方法,如下所示:返回MyGenericClass.StaticMethod()而您的问题是,当您调用静态方法时,编译器无法定义类型。因此,您需要找到一种语法来帮助编译器定义或的正确部分的类型,这是因为Callable.call()
引发普通异常。我应该添加我自己的功能界面抛出E吗?@Thorbjørnravandersen为什么需要功能界面抛出E
?好吧,刚才看到diginoise的答案。。。坚持这一点
class EitherWrapper {
public static <R> Either<Exception, R> wrap(final Callable<R> callable) {
try {
return Either.right(callable.call());
} catch (final Exception ex) {
return Either.left(ex);
}
}
}
final Either<Exception, Object> e = EitherWrapper.wrap(Object::new);