[英]How to properly generify this class to avoid unchecked warning?
我有这个微小的类,它提供大约的东西,可能会抛出异常,并返回一个javaslang 2.05无论是包装(其按照惯例在发生故障left
和正常的结果right
,任何要么只能是其中之一)。
public class EitherWrapper {
public static <E extends Exception, R> Either<E, R> wrap(Callable<R> callable) {
try {
return Either.right(callable.call());
} catch (Exception e) {
return (Either<E, R>) Either.left(e);
}
}
}
适用于Either.left
Javadoc, Either.left
为https://static.javadoc.io/io.javaslang/javaslang/2.0.5/javaslang/control/Either.html#left--
问题是javac标志return (Either<E, R>) Either.left(e);
作为未经检查的演员表(这很公平,因为javac认为它是Either<Exception,Object
>),但我真的想正确地解决此问题,而不是仅仅进行铸造。 我应该如何重写此类,以免警告消失?
事实是,无论如何,您都将Either.Left
固定为例外,因此您无法实现泛型所允许的通用性。
始终将其挂接到Exception
并具有以下内容:
public static <R> Either<Exception, R> wrap(Callable<R> callable) {
try {
return Either.right(callable.call());
} catch (Exception e) {
return Either.left(e);
}
}
使用类型推断来解析右侧部分的类型:
return Either.<E, R>left(e);
既然知道Either
包装了一个Exception
我就可以这样做:
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);
}
}
}
由于E
的类型是在函数中明确定义的,因此不必将抛出的Exception
泛化为E
当然Either<? extends Exception, R>
Either<? extends Exception, R>
也可以。
编译并正确运行,例如:
final Either<Exception, Object> e = EitherWrapper.wrap(Object::new);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.