繁体   English   中英

如何适当地泛化此类,以避免未经检查的警告?

[英]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.lefthttps://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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM