为枚举实现MessageBodyReader

时间:2015-08-17 02:51:28

标签: java enums jax-rs

我正在尝试实现一个新的MessageBodyReader / Writer组合,我在阅读器部分遇到了麻烦。鉴于以下声明

public class Jsr367EnumProvider<T extends Enum> implements
                                                MessageBodyReader<T>,
                                                MessageBodyWriter<T>

有效,但有警告称Enum是未加工的。所以为了解决它,我试图放入Enum<?>

但是,这会在我的readFrom方法

中产生错误
@Override
public T readFrom(final Class<T> type,
    final Type genericType,
    final Annotation[] annotations,
    final MediaType mediaType,
    final MultivaluedMap<String, String> httpHeaders,
    final InputStream inputStream) throws IOException,
        WebApplicationException {

    // TODO support other encodings using the HTTP Header
    try (Scanner s = new Scanner(inputStream).useDelimiter("\\A")) {
        return (T) Enum.valueOf(type, s.next());
    }

}

这也警告了一个未经检查的演员阵容。有没有办法解决这个问题而不诉诸@SupressWarnings

1 个答案:

答案 0 :(得分:0)

不,没有。回想一下您尝试投射的方法的签名:

Enum.valueOf(Class<T> enumType, String name)

严格说明您提供的代码,您无法摆脱警告。所以要压制它,但要遵循良好的做法,例如 Effective Java 2nd Edition中规定的内容:第24项:消除未经检查的警告:

  
      
  • 消除所有未经检查的警告。
  •   
  • 如果您无法消除警告,并且您可以证明引发警告的代码是类型安全的,那么(并且只有这样)才会使用@SuppressWarning("unchecked")注释来抑制警告。
  •   
  • 始终在尽可能小的范围内使用SuppressWarning注释。
  •   
  • 每次使用@SuppressWarning("unchecked")注释时,请添加注释,说明为何可以安全使用。
  •