Java接口中的静态方法

8
据我所知,您不能在接口主体中声明静态方法。 但是,我在http://docs.oracle.com/网站上意外发现了一个奇特的代码片段。 这里是链接 具体来说,
public interface TimeClient 
{
void setTime(int hour, int minute, int second);
void setDate(int day, int month, int year);
void setDateAndTime(int day, int month, int year,
                           int hour, int minute, int second);
LocalDateTime getLocalDateTime();

static ZoneId getZoneId (String zoneString) {
    try {
        return ZoneId.of(zoneString);
    } catch (DateTimeException e) {
        System.err.println("Invalid time zone: " + zoneString +
            "; using default time zone instead.");
        return ZoneId.systemDefault();
    }
}

default ZonedDateTime getZonedDateTime(String zoneString) {
    return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
    }
}

这个 interface 有一个 static 方法 getZoneId

我有点迷惑,请问能否解释一下?


4
从Java 8开始,接口中可以声明静态方法。还要注意 getZoneDateTime() 方法(虚拟扩展方法,在Java 8中也是新的)。 - fge
1
请阅读此链接:http://marioosh.5dots.pl/2014/02/12/java-8-default-and-static-methods-in-interfaces.html。 - Sap
你还没有看过Java 8的新功能列表吗?去看看吧。 - Eric
5个回答

15

你是Java 8中两个新特性的见证者:

  • 接口中的静态方法
  • 虚拟扩展方法。

代码示例中,getZoneId()展示了第一个新特性,而.getZoneDateTime()则展示了第二个新特性。

尤其是第二个新特性,它允许像.stream()这样的附加方法扩展Collection接口,而不会破坏向后兼容性。请参见此处以了解更多细节。

第一个新特性允许避免编写仅用于提供接口实用程序静态方法的“方法包”类。例如,Guava的Functions(不要与Java 8中的Function混淆,它基本上是从Guava中窃取的,还有Predicate和其他一些)。


6

1
大家都正确回答了我的问题。不过你是第一个回答的。 - Russell'sTeapot
2
并不是这样的,default和static方法之间有区别,所以让我们不要混淆它们(也不要让其他用户混淆)。这可能是一个好的指针,但不是正确的答案。 - virgo47
1
@virgo47 你说得对,我不确定我在这里做什么。我查看了一下问题是否最初提到了默认方法,但没有。我会删除这个回答。额,无法删除它,因为它已被接受 :( - Sean Owen

5
从Java 8开始,您可以这样做。您引用的官方教程(已更新至Java 8)最好地阐述了这一点:
接口体可以包含抽象方法、默认方法和静态方法。在接口中定义抽象方法时,跟在方法名后面的是分号,而不是花括号(抽象方法没有实现)。默认方法使用default修饰符定义,静态方法使用static关键字定义。接口中的所有抽象、默认和静态方法都是公共的,因此可以省略公共修饰符。
或者来自Java 8的JLS 9.4节
默认方法是在接口中声明的带有default修饰符的方法;它的主体始终由一个块表示。它为任何实现该接口而不覆盖该方法的类提供了默认实现。默认方法与在类中声明的具体方法不同。
接口可以声明静态方法,这些方法可以在没有特定对象的情况下调用。

5

4

在Java 8中,接口可以拥有静态方法,以及可重写的默认实现方法。但它们仍然不能拥有实例字段。这些特性是Lambda表达式支持的一部分,您可以在JSR 335 的H部分中了解更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接