如何避免 @SuppressWarnings({ "unchecked", "rawtypes" }) 无处不在?

5Yr*_*DBA 9 java generics

我有一个通用的Parameter 接口及其 ParameterImpl 具体类。T 将是 Float、Long、Integer 或 String。

public interface Parameter<T extends Comparable<T>>  {}  
public class ParameterImpl<T extends Comparable<T>> implements Parameter<T> {}
Run Code Online (Sandbox Code Playgroud)

我还有其他几个普通类,它们将使用上面带有警告的泛型Parameter类型,如下所示:

public class ProcessParameter() {

    Map<String, Parameter> params; //use <?> or @SuppressWarnings   ???

    //use <?> or @SuppressWarnings or <T extends Comparable>   ???
    public Parameter getParameter(String key, Map<String, Parameter> paramMap)
    {

    }

    //use <?> or @SuppressWarnings or <T extends Comparable>   ???
    public void addParameter(Parameter param)
    {

    }

    //use <?> or @SuppressWarnings or <T extends Comparable>   ???
    public Map<String, Parameter> getParameterMap()
    {

    }

    //many more cases with Parameter presents
}
Run Code Online (Sandbox Code Playgroud)
  1. 对于Map<String, Parameter> params;可变情况,我应该使用<?>还是@SuppressWarnings?为什么你建议的方式更好?

  2. 对于方法案例,如果我使用<?><T extends Comparable>(在方法签名中),那么它将影响所有其他相关的方法。在@SuppressWarnings涵盖只是在这里这个问题。那么,我应该选择哪个选项?为什么您建议的选项比其他选项更好?

  3. 在大多数情况下,Eclipse 会提供建议@SuppressWarnings。是@SuppressWarnings正确的方法还是内部存在潜在错误的临时解决方案?

Tho*_*mas 1

<?>如果参数类型可能不同,我会使用。使用原始类型,因此 @SuppressWarnings 可能会导致编译器进一步禁用泛型类型检查(取决于您如何使用这些参数),这可能不是您想要的。

当然,您无法更改 实例的值,Parameter<?>但这可能并不明智,因为您不再知道该类型。

有关原始类型的更多信息,请查看此处:什么是原始类型以及为什么我们不应该使用它?