如何在java泛型中定义类型参数的静态字段

问题描述 投票:0回答:2

我想定义一个这样的时间接口:

public interface TimeInterface<T>
{
    static T ZERO;
    static T INFINITY;
    // some other methods...
}

这可能吗?或者如何避免错误?

提前致谢!

java oop generics interface static
2个回答
26
投票

直接来自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
。因此,您不能创建参数类型的静态字段。


5
投票

唯一可以包含类型参数的东西是 static 方法,它必须定义自己的类型参数。比如:


static

在您的情况下,类型参数具有类范围,它是实例绑定的,与类的

static <T> void staticGenericMethod(T param) { .. }
 成员无关。 

因此,您应该

要么
删除

static

static

ZERO
关键字,要么
引入返回
INFINITY
staticZERO
方法。例如:
INFINITY
请注意,
public interface TimeInterface<T> { static <X> X getZero() { //implementation } static <X> X getInfinity() { } }

类型参数仅对相应的静态方法有效,并且不在类中共享。

但是,这种方法的问题在于,无法

确保

实例类型参数 (
X

) 与静态方法的类型参数 (

T) 相同,这可能会导致严重问题使用不当时。

另请注意,Java8 中的接口中允许使用 
X
 方法,因此如果您使用订单 Java 版本,则应将 
static

转换为类。

© www.soinside.com 2019 - 2024. All rights reserved.