2017-07-19 90 views
-2

Java8允许接口具有静态方法。如果有人解释在哪种情况下我们可能需要使用静态方法进行接口,那将会非常有用。Java8中的静态方法

在此先感谢。

+3

你有没有试过Google为“java 8 interface static method”之类的东西? –

回答

1

资源可以发现herehere

  1. Java接口的静态方法是界面的一部分,我们不能用它来实现类的对象。
  2. Java接口的静态方法有利于提供实用方法,例如空检查,收集整理等
  3. Java接口的静态方法帮助我们通过提供安全不允许实现类覆盖它们
  4. 我们无法为Object类方法定义接口静态方法,因为“这个静态方法不能从Object中隐藏实例方法”,我们会得到编译器错误。这是因为它不允许在java中使用,因为
  5. 对象是所有类的基类,我们不能有一个类级别的静态方法和另一个具有相同签名的实例方法。
  6. 我们可以使用java接口静态方法来移除集合等实用工具类,并将其所有静态方法移至相应的接口,这将很容易找到和使用。
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(); 
      } 
     }; 
    } 
} 
0

从我有误 -

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

2.他们只能访问该接口的功能(不能被覆盖)。

所以,只要你希望你的接口的函数(它不是静态的,也不是重写的)使用那个函数(静态的),就可以使用它们。

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

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

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