Java 通配符泛型作为 Eclipse 和 SonarQube 中的返回警告

2022-09-02 21:46:03
private List gridModel;

public List getGridModel() {
        return gridModel;
}

Eclipse 显示一条警告:

列表是原始类型。对泛型类型 List 的引用应参数化。

将代码更改为以下内容将删除警告

private List<?> gridModel;

public List<?> getGridModel() {
        return gridModel;
}

然而,上面的代码显示了SonarQube中的一个主要陷阱错误,它说:

删除通用通配符类型的用法。不应在返回参数中使用泛型通配符类型

那么我该如何解决此警告呢?
我在这里看到类似的问题,但找不到解决方案。

使用未删除声纳警告。Class<? extends Object>


答案 1

那么我该如何解决此警告?

您可以为类使用类型参数:

public class GridModelHolder<T> {
   private List<T>  gridModel;

   public List<T> getGridModel() {
    return gridModel;
   }
}

然后,客户端代码可以决定哪种类型的保留:ListGridModelHolder

GridModelHolder<String> gridModelHolder = new GridModelHolder<String>(new ArrayList<String>);

但是,如果您坚持使用原始类型,则可以禁止显示警告或仅具有对象列表(不建议使用这些对象)

@SuppressWarnings("unchecked")
public class GridModelHolder {
   private List  gridModel;

   public List getGridModel() {
    return gridModel;
   }
}

public class GridModelHolder {
   private List<Object>  gridModel;

   public List<Object> getGridModel() {
    return gridModel;
   }
}

答案 2

使类采用泛型。将该类属应用于 .此外,警告是有效的(没有泛型的集合类型是原始类型)。像这样,List

class MyClass<T> {
    private List<T> gridModel;    
    public List<T> getGridModel() {
            return gridModel;
    }
}

如果你真的想禁用类型检查,那么让泛型打开(这就是原始类型)就像ListObject

private List<Object> gridModel;    
public List<Object> getGridModel() {
        return gridModel;
}