java接口中的静态方法

Rus*_*pot 7 java static-methods interface

据我所知,你不能在接口体中声明静态方法.但是,我不小心在http://docs.oracle.com/网站上发现了一些特殊的代码.这是链接

Namelly

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

interface有一个static方法getZoneId

我迷路了...有人可以解释一下

fge*_*fge 15

您是Java 8中两个新功能的见证者:

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

在您提供的代码示例中,getZoneId()说明了第一个新颖性,.getZoneDateTime()第二个是新颖性.

第二个特别是允许Collection使用补充方法扩展接口的内容.stream(),例如,不会破坏向后兼容性.请看这里的插图.

第一个允许避免编写"方法包"类,这些类通常仅用于在接口上提供实用程序静态方法.一个这样的例子就是Guava的Functions(不要与Java 8一起混合Function,它基本上从Guava中偷走了,还有Predicate其他几个)


Sea*_*wen 6

Java 8现在有了接口中"默认"方法实现的想法:

http://blog.hartveld.com/2013/03/jdk-8-13-interface-default-method.html

  • 不是真的,默认方法和静态方法之间存在差异,所以不要混淆那些(和其他用户).这可能是一个很好的指针,但不是一个正确的答案. (2认同)

Jas*_*n C 5

从Java 8开始,您可以执行此操作.您的代码段来自的官方教程(已针对Java 8进行了更新)说得最好:

接口主体可以包含抽象方法,默认方法和静态方法.接口中的抽象方法后跟分号,但没有大括号(抽象方法不包含实现).默认方法使用default修饰符定义,静态方法使用static关键字定义.界面中的所有抽象,默认和静态方法都是隐式公共的,因此您可以省略public修饰符.

或者从Java 8的JLS第9.4节开始:

默认方法是在具有default修饰符的接口中声明的方法; 它的身体总是由一个块代表.它为实现接口的任何类提供了一个默认实现,而不会覆盖该方法.默认方法与具体方法不同,具体方法在类中声明.

...

接口可以声明静态方法,这些方法在不引用特定对象的情况下被调用.


Iva*_*nin 5

来自Java语言规范(Java SE 8 Edition):http://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.4

接口可以声明静态方法,这些方法在不引用特定对象的情况下被调用.