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

Ali*_*ahi 11 java generics return sonarqube

private List gridModel;

public List getGridModel() {
        return gridModel;
}
Run Code Online (Sandbox Code Playgroud)

Eclipse显示警告:

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

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

private List<?> gridModel;

public List<?> getGridModel() {
        return gridModel;
}
Run Code Online (Sandbox Code Playgroud)

但是,上面的代码显示了SonarQube中的一个主要陷阱错误:

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

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

使用Class<? extends Object>没有删除声纳警告.

CKi*_*ing 8

那么我该如何修复此警告呢?

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

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

   public List<T> getGridModel() {
    return gridModel;
   }
}
Run Code Online (Sandbox Code Playgroud)

然后,客户端代码可以决定什么类型的List GridModelHolder保留:

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

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

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

   public List getGridModel() {
    return gridModel;
   }
}
Run Code Online (Sandbox Code Playgroud)

要么

public class GridModelHolder {
   private List<Object>  gridModel;

   public List<Object> getGridModel() {
    return gridModel;
   }
}
Run Code Online (Sandbox Code Playgroud)


Ell*_*sch 6

使该类具有通用性.将该泛型应用于List.此外,警告有效(没有泛型的集合类型是原始类型).就像是,

class MyClass<T> {
    private List<T> gridModel;    
    public List<T> getGridModel() {
            return gridModel;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你真的想要禁用类型检查,那么就使用List泛型Object(这是原始类型)

private List<Object> gridModel;    
public List<Object> getGridModel() {
        return gridModel;
}
Run Code Online (Sandbox Code Playgroud)