Java8中的静态方法

时间:2017-07-19 10:14:14

标签: inheritance java-8 static-methods

Java8允许接口具有静态方法。如果有人解释我们可能需要使用静态方法进行接口,那将非常有用。

提前致谢。

3 个答案:

答案 0 :(得分:3)

您是否搜索过jdk来源?至少有两个例子如何:

 Function.identity()

具有以下实现:

static <T> Function<T, T> identity() {
    return t -> t;
}

Predicate.isEqual看起来像:

static <T> Predicate<T> isEqual(Object targetRef) {
    return (null == targetRef)
            ? Objects::isNull
            : object -> targetRef.equals(object);
} 

通常我将它们视为静态工厂方法,返回该接口的实例。

我在代码库中使用了一个很好的例子(but it comes from Holger initially):

public interface UncheckedCloseable extends Runnable, AutoCloseable {
    @Override
    default void run() {
        try {
           close();
        } catch (Exception ex) {
           throw new RuntimeException(ex);
        }
    }

    static UncheckedCloseable wrap(AutoCloseable c) {
       return c::close;
    }

    default UncheckedCloseable nest(AutoCloseable c) {
        return () -> {
            try (UncheckedCloseable c1 = this) {
                c.close();
            }
        };
    }
 } 

答案 1 :(得分:1)

可以找到资源herehere

  1. Java接口静态方法是接口的一部分,我们不能将它用于实现类对象。
  2. Java接口静态方法适用于提供实用程序方法,例如null检查,集合排序等。
  3. Java接口静态方法通过不允许实现类覆盖它们来帮助我们提供安全性
  4. 我们无法为Object类方法定义接口静态方法,我们将编译器错误称为“此静态方法无法从Object隐藏实例方法”。这是因为它不允许在java中,因为
  5. Object是所有类的基类,我们不能有一个类级静态方法和另一个具有相同签名的实例方法。
  6. 我们可以使用java接口静态方法来删除诸如Collections之类的实用程序类,并将其所有静态方法移动到相应的接口,这很容易找到和使用。

答案 2 :(得分:0)

据我所知 -

1.这些方法不能被继承它的类覆盖。

2.只能访问该界面的功能(不得覆盖)。

因此,只要您希望接口的函数(非静态或覆盖)使用该函数(静态),就可以使用它们。

因此,您可以使用自己的业务逻辑,自己的排序方法,一些限制或边界。

所以它可以被用作好像有人调用你的函数,并在其他函数的帮助下你自己做的东西。就像其他程序员实现你的界面来使用一些为自己的程序提供一些支持的功能(例如,可以保存笔记,计划你的会议等的日历)。

但请记住,您不应该覆盖调用这些静态函数的函数。