我正在编写一个容器类,并且对此代码的要求规定了(A)我应该使用泛型,(B)我应该只允许它接受内置的包装类(如Integer,Short,Double)等等。)
也就是说,我希望能够使用以下内容:
MyContainer<Integer>
MyContainer<Double>
但不应该允许这种东西:
MyContainer<MyClass1>
MyContainer<MyClass2>
通过我对这个主题的研究,我找到了类似的东西:
public class MyContainer<T extends (???)>
这让我想知道:所有内置的包装器都扩展了一个我可以用这种方式指定的公共类来使它工作吗?
或者,有没有办法让通用只接受定义的类列表?这可能是一个更好的选择,因为通用类型不会被扩展公共接口的用户定义的类所欺骗,但我不确定它是否可能这样做( ?)。
答案 0 :(得分:5)
或者,是否有任何方法可以使通用只接受a 定义了类列表?
不,没有这样的功能。
泛型边界提供了对类型层次结构的限制。例如,对于内置数字类型,共同的祖先是Number
。但是你无法阻止任何人创建自己的Number
子类并将其与容器类一起使用。
你对仿制药运气不好。考虑使用一个工厂,它为你关心的内置类型提供预构建的容器类型,并为任何其他类型抛出异常。
答案 1 :(得分:1)
根据Javadoc链接,有java.lang.Number
直接已知子类:
AtomicInteger, AtomicLong, BigDecimal, BigInteger, Byte, Double, Float, Integer, Long, Short
包含您的包装类型。当然,它还包括一些。它也不会阻止用户扩展Number。所以不,我认为没有使用泛型T
并在运行时检查类是不可能的。