[英]Java formal type parameter definition (Generics)
我想定义一个泛型类型,其实际类型参数只能是
Long
, Integer
, Float
, Double
) String
我可以通过这样的定义满足第一个要求
public final class MyClass<T extends Number> {
// Implementation omitted
}
但我无法弄清楚如何满足他们两个。 我怀疑这实际上是不可能的,因为AFAIK在定义形式类型参数时没有办法指定“或”语义,尽管你可以使用如下的定义来指定“和”语义
public final class MyClass<T extends Runnable & Serializable > {
// Implementation omitted
}
干杯,唐
您可以对所有受支持的类型使用工厂方法,并使构造函数为private / protected。 你必须在构造函数中修改泛型类型,以便它有意义,所以你可能会像这样编码:
public final class MyClass<T> {
public static MyClass<Integer> newInstance(int i) {
return new MyClass<Integer>(i);
}
public static MyClass<String> newInstance(String s) {
return new MyClass<String>(s);
}
//More factory methods...
protected MyClass(T obj) {
//...
}
}
或者如果你不想要构造函数参数,就像这样:public final class MyClass {public static MyClass newIntegerInstance(){return new MyClass(); } // ...}
正如erickson所说,通用实现无论如何都只能依赖于Object,因此唯一的限制是,除了原语和String之外,还可以为其他类型创建其他实现。
虽然泛型在这里不起作用,但是具有Number
和String
派生类型的基类型。 由于泛型类型无论如何都会擦除到Object
,因此您在其中放置的任何功能都可以放在抽象基类中。 您可能只需要子类上的特定于类型的访问器来获取值。
另外,请注意Number
类。 它不仅限于装箱原始类型,因为任何人都可以扩展它 - 例如, BigInteger
。
也许你可以做以下事情:
MyClass<T>
成为一个包默认类,对其他组件不可见,或者至少只对包默认的ctors,因此它不能在包外扩展或实例化。 MyClass<T>
包中创建两个公共类: MyNumericClass<T extends Number> extends MyClass<T> MyStringClass extends MyClass<String>
这样,MyClass的所有子类都将限制为使用Number子类或String进行参数化的子类。
有趣的问题,它让我感到困惑。 但显然这是不可能的。 我尝试了几种不同的黑客,没有一种真正起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.