Java 选择性泛型

标签 java generics types parameters

class A <T> {

    private T field;
}

我知道我可以使用 < ... extends ... > 强制类型参数为某种有界类型,但是我如何强制类型参数 T 只能是 String、Integer、SomeClassB、SomeEnumC 而不是可以用其他任何东西对其进行参数化吗?

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

将是合法的。

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

将是非法的。

我已经尝试使用

测试这些类型
T instanceof SomeEnumC

在类A的构造函数中,但是很乱。

最佳答案

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


您不能限制 T 可接受的通用类型到您的示例中的不相关类列表。您只能使用 super 限制泛型类型或 extends ,这意味着它们必须是某些给定类型的父类(super class)型或子类型。

但是,由于您似乎只有有限数量的类,因此您希望允许 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.*;

关于Java 选择性泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19884189/

相关文章:

java - 简单的计时器示例,但它不会正常工作

java - 在非泛型类中采用 List 的泛型方法

c# - 在方法返回上使用隐式类型语法

Java随机崩溃

java - 如何从java中的空值空字符串替换?

java - 如何使用 JAX-RS NewCookie 删除服务器上的 cookie?

java - 如何使用传入的通用对象列表并通过 Java 方法返回通用对象?

Java:将 Collection.class 转换为 Class<Collection<T>>

java - 没有明确声明泛型类型的赋值如何被滥用?

ios - 核心数据、NSNumber、整数 32 和整数 64