覆盖`ParamConvertorProvider`的通用抽象方法

时间:2018-12-30 06:31:24

标签: java generics jax-rs

我正在JAX-RS应用程序中提供EFK的实现。此实现提供了接口中的抽象方法的定义,签名为:

ParamConverterProvider

我正在玩在线教程,并对实现进行了如下修改。

public <T> ParamConverter<T> getConverter(Class<T> rawType, Type genericType, Annotation annotations[]);

我有几个问题:

  1. 为什么将package org.koushik.javabrains.rest; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import java.util.Calendar; import javax.ws.rs.ext.ParamConverter; import javax.ws.rs.ext.ParamConverterProvider; import javax.ws.rs.ext.Provider; import org.koushik.javabrains.rest.MyDate; @Provider public class MyDateConverterProvider implements ParamConverterProvider { @Override public <MyDate> ParamConverter<MyDate> getConverter(final Class<MyDate> rawType, Type genericType, Annotation[] annotations) { return new ParamConverter<MyDate>() { @Override public MyDate fromString(String value) { Calendar requestedDate = Calendar.getInstance(); if ("tomorrow".equalsIgnoreCase(value)) { requestedDate.add(Calendar.DATE, 1); } else if ("yesterday".equalsIgnoreCase(value)) { requestedDate.add(Calendar.DATE, -1); } org.koushik.javabrains.rest.MyDate myDate = new org.koushik.javabrains.rest.MyDate(); myDate.setDate(requestedDate.get(Calendar.DATE)); myDate.setMonth(requestedDate.get(Calendar.MONTH)); myDate.setYear(requestedDate.get(Calendar.YEAR)); return rawType.cast(myDate); } @Override public String toString(MyDate myBean) { if (myBean == null) { return null; } return myBean.toString(); } }; } } 返回的T型实例化时,为什么需要提供完整的软件包名称。它具有与此当前类相同的程序包名称,但仍然需要编写完全限定的名称,否则会出现编译错误,无法实例化。 getConverter。如果将其导入顶部,则没有任何区别。 org.koushik.javabrains.rest.MyDate myDate = new org.koushik.javabrains.rest.MyDate();
  2. 在方法开始时,我收到此警告类型参数MyDate隐藏了类型MyDate。 该提供程序可以正常工作,并且能够转换请求路径参数,但是仍然想知道如何避免上述两个。

1 个答案:

答案 0 :(得分:0)

  1. 您不知道。您已经导入了该类,因此您不需要完整的名称。

  2. 请勿重新参数化您覆盖的方法。只需从方法签名中删除类型参数即可。请注意以下代码段中没有它。

    @Override
    public ParamConverter<MyDate> getConverter(final Class<MyDate> rawType, Type genericType, Annotation[] annotations) {