Javaforms类型参数定义(generics)

我想定义一个generics类型,其实际类型参数只能是

  1. 一个数字原始包装类( LongIntegerFloatDouble
  2. String

我可以通过这样的定义满足第一个要求

 public final class MyClass { // Implementation omitted } 

但我无法弄清楚如何满足他们两个。 我怀疑这实际上是不可能的,因为AFAIK在定义forms类型参数时没有办法指定“或”语义,尽管你可以使用如下的定义来指定“和”语义

 public final class MyClass { // Implementation omitted } 

干杯,唐

Javagenerics不支持联合类型(此参数可以是A OR B)。

在某些可能感兴趣的相关注释中,如果要强制实施多个限制,它确实支持多个边界。 这是Java generics教程中提到的JDK的一个例子:

 public static > T max(Collection coll) 

您可以对所有受支持的类型使用工厂方法,并使构造函数为private / protected。 你必须在构造函数中修改generics类型,以便它有意义,所以你可能会像这样编码:

 public final class MyClass { public static MyClass newInstance(int i) { return new MyClass(i); } public static MyClass newInstance(String s) { return new MyClass(s); } //More factory methods... protected MyClass(T obj) { //... } } 

或者如果你不想要构造函数参数,就像这样:public final class MyClass {public static MyClass newIntegerInstance(){return new MyClass(); } // …}

正如erickson所说,通用实现无论如何都只能依赖于Object,因此唯一的限制是,除了原语和String之外,您还可以为其他类型创建其他实现。

虽然generics在这里不起作用,但是具有NumberString派生类型的基类型。 由于generics类型无论如何都会擦除到Object ,因此您在其中放置的任何function都可以放在抽象基类中。 您可能只需要子类上的特定于类型的访问器来获取值。

另外,请注意Number类。 它不仅限于装箱原始类型,因为任何人都可以扩展它 – 例如, BigInteger

有趣的问题,它让我感到困惑。 但显然这是不可能的。 我尝试了几种不同的黑客,没有一种真正起作用。

也许你可以做以下事情:

  1. 使MyClass成为一个包默认类,对其他组件不可见,或者至少只对包默认的ctors,因此它不能在包外扩展或实例化。
  2. MyClass包中创建两个公共类:
 MyNumericClass extends MyClass MyStringClass extends MyClass 

这样,MyClass的所有子类都将限制为使用Number子类或String进行参数化的子类。