我正在编写一个扩展超类的类型的通用库 . 我希望每个子类都定义一个零元素,但我希望零元素从一个子类到另一个子类不同 . 我可以使用非静态成员函数获得相同的结果,但我觉得这样做很脏,因为它本质上与类的特定成员无关,我希望能够在没有首先实例化的情况下调用它班上的一员 .
即,我想实现类似的东西:
abstract class ParentClass{
static ParentClass zero();
}
class ChildClass extends ParentClass{
static ChildClass zero() => new ChildClass(0);
ChildClass(int n){
//do something
}
}
class GenericClass<T extends ParentClass>{
T zero = T.zero();
}
上面显然不起作用,但希望它解释了我的意图 . 有什么想法吗?
2 回答
如果问题是泛型类依赖于零值,则立即解决方案应该是在创建它时将零值传递给泛型类实例(就像传递type参数一样) .
那是:
和
如果可能的话,我建议将'zero'字段设为const .
这可能是最好/唯一的解决方案,允许您的泛型类具有零对象可用,缺少使用镜像(这将是过度杀伤) .
如您所知,您无法访问类型参数上的静态成员 . 静态成员在编译时解析,因此查找不能在实例之间变化,具体取决于类型参数 . 这也打击了大多数其他直接使用静态或常量场的尝试 .
您可以在每个返回零实例的类上创建一个实例方法(如果可能,可以将其设置为const,或者将其存储在私有静态字段中以避免每次都创建一个新实例) . 这需要你在能够获得零实例之前拥有一个实例,并且没有实例可能是需要零实例的原因,所以这可能也不会飞 .
静态函数不是类接口的一部分,因此
<T extends ParentClass>
没有帮助 . 静态函数只能由MyClassName.myFunctionName()
访问 .我不知道你的要求的解决方案 .
我在类似情况下所做的是声明一个保存值的静态字段和一个返回静态值的非静态getter .
但是这样你仍然需要有一个实例来访问该值(或者使用文字类名作为前缀来访问它) .