我想定义一个这样的时间接口:
public interface TimeInterface<T>
{
static T ZERO;
static T INFINITY;
// some other methods...
}
这可能吗?或者如何避免错误?
提前致谢!
直接来自javadoc:
无法声明类型为类型参数的静态字段
类的静态字段是类的所有非静态对象共享的类级变量。因此,类型参数的静态字段是不允许的。考虑以下课程:
public class MobileDevice<T> { private static T os; // ... }
如果允许类型参数的静态字段,那么下面的代码会很混乱:
MobileDevice<Smartphone> phone = new MobileDevice<>(); MobileDevice<Pager> pager = new MobileDevice<>(); MobileDevice<TabletPC> pc = new MobileDevice<>();
因为静态字段
由os
、phone
和pager
共享,那么pc
的实际类型是什么?不能同时为os
、Smartphone
和Pager
。因此,您不能创建参数类型的静态字段。TabletPC
唯一可以包含类型参数的东西是 static
方法,它必须定义自己的类型参数。比如:
static
在您的情况下,类型参数具有类范围,它是实例绑定的,与类的
static <T> void staticGenericMethod(T param) { .. }
成员无关。
因此,您应该
要么删除
static
和static
的
ZERO
关键字,要么引入返回
INFINITY
和
static
的ZERO
方法。例如:
INFINITY
请注意,
public interface TimeInterface<T> {
static <X> X getZero() {
//implementation
}
static <X> X getInfinity() {
}
}
类型参数仅对相应的静态方法有效,并且不在类中共享。 但是,这种方法的问题在于,无法
确保
实例类型参数 (
X
) 与静态方法的类型参数 (T
) 相同,这可能会导致严重问题使用不当时。
另请注意,Java8 中的接口中允许使用
X
方法,因此如果您使用订单 Java 版本,则应将
static
转换为类。