Java选择性泛型

class A <T> {

    private T field;
}

我知道我可以使用<强制类型参数为某种有界类型. ...扩展...&gt ;,但是如何强制类型参数T只能是String,Integer,SomeClassB,SomeEnumC,而不能用其他参数对其进行参数化?

A<SomeClassB> a = new A<SomeClassB>();

会合法的.

A<SomeClassX> a = new A<SomeClassX>();

将是非法的.

我已经尝试使用以下方法测试这些类型

T instanceof SomeEnumC

在类A的构造函数中,但是非常混乱.

解决方法:

注意:我同意@Jeffrey的上面的评论,这似乎没有多大意义,因为通过执行这种限制似乎无法获得任何有用的类型信息.我真的很想知道您的用例在这里.

您不能将T可接受的泛型类型限制为不相关类的列表,例如您的示例.您只能使用超级或扩展来限制泛型类型,这意味着它们必须是某些给定类型的超级或子类型.

但是,由于您似乎想允许T的类数量有限,因此您应该只能枚举所有这些类.这就是我的想法:

public class A<T> {

  /**
   * Private constructor means only nested classes
   * can extend this class. We use this to limit the
   * types that can be used for T.
   */
  private A() { }

  /** Integer version of A */
  public static class IntA extends A<Integer> { }

  /** String version of A */
  public static class StringA extends A<String> { }

}

现在,您可以使用static import导入A&T的任何嵌套版本.您想要的,或者所有这些都像这样:import static A. *;

上一篇:Python继承的类型变量


下一篇:javascript-精细的上传验证集