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/