繁体   English   中英

如何避免返回类型中的通配符

[英]How to avoid the wildcard in the return type

给定以下类型层次结构:

public class GenericBaseClass<T> { }

public class SpecializedClass<T, E extends Enum<E> & SomeInterface> extends GenericBaseClass<T> { }

public class SomeProvider {
    private static final List<SpecializedClass<Foo, ?>> VALUES =
        Arrays.asList(createValue());

    List<SpecializedClass<Foo, ?>> getValues() {        
        return VALUES;
    }

    private static SpecializedClass<Foo, Bar> createValue() {
        return new SpecializedClass<>();
    }
}

public class Foo {}
public enum Bar implements SomeInterface {}
public interface SomeInterface {}

SomeProvider应该为具体类型Foo公开可用SpecializedClass的列表。 (为了简化这个例子,这里只给出了Bar类型的一种具体化。)

根据https://rules.sonarsource.com/java/RSPEC-1452

不应在返回参数中使用通用通配符类型

这个片段被声纳标记为关键代码异味。

到目前为止,我无法摆脱这里的通配符。 将 getter 方法更改为

List<GenericBaseClass<Foo>> getValues() {        
    return VALUES;
}

将避免警告,但客户端会丢失信息,即此列表仅包含SpecializedClass实例。

基本上我在这里有两个问题:

  1. 在这种情况下,这真的是一种糟糕的代码味道吗? 在这里使用此 getter 方法的客户端可能存在哪些陷阱?

  2. 如果在返回类型中不使用通配符,getter 应该是什么样子?

非常感谢您的帮助。

使用有什么问题

import java.util.Collections;
import java.util.List;

public class SomeProvider {

  private static final List<SpecializedClass<Foo, Bar>> VALUES =
      Collections.singletonList(createValue());

  List<SpecializedClass<Foo, Bar>> getValues () {
    return VALUES;
  }

  private static SpecializedClass<Foo, Bar> createValue () {
    return new SpecializedClass<>();
  }
}

?

编辑:

也可能但不确定您的静态代码分析是

import java.util.Arrays;
import java.util.List;

public class SomeProvider {

  private static final List<SpecializedClass<Foo, ? extends SomeInterface>> VALUES =
      Arrays.asList(createValue1(), createValue2());

  List<SpecializedClass<Foo, ? extends SomeInterface>> getValues () {
    return VALUES;
  }

  private static SpecializedClass<Foo, Bar1> createValue1 () {
    return new SpecializedClass<>();
  }

  private static SpecializedClass<Foo, Bar2> createValue2 () {
    return new SpecializedClass<>();
  }
}

这至少将您的返回类型绑定到SomeInterface的子类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM