Java:在同一接口的另一个默认方法中调用默认方法

时间:2016-02-24 20:11:48

标签: java java-8 default-method

我是java 8新功能的新手,并尝试理解默认方法。有没有比使用匿名类更简单的方法来调用同一接口的另一个默认方法的默认方法? 例如:

public class Frame{

    public static void main(String... args){
        Frame.C c= new Frame.C();
        c.doSomething();
    }

    public interface A{
        public default void doSomething(){
            System.out.println("A");
        }
    }

    public interface B extends A {
        @Override
        public default void doSomething(){
            System.out.println("B");

            //is there an easier way to invoke that method??
            new B(){}.other();
        }
        default public void other(){
            //doSomething();
            System.out.println("other");
        }
    }

    public static class C implements B{
        @Override 
        public void other(){
            Lambda.B.super.other();
            System.out.println("C");

        }
    }

}

1 个答案:

答案 0 :(得分:4)

你的意图并不完全清楚,但构造 var siteApp = angular.module('siteApp', ['ui.router', 'ngSanitize', 'ngAnimate', 'datatables','datatables.buttons','ngCookies']); siteApp.config(function ($stateProvider, $urlRouterProvider,$httpProvider) { $urlRouterProvider.otherwise("/index"); $httpProvider.defaults.headers.common['X-CSRF-Token'] = $('meta[name=csrf-token]').attr('content'); $stateProvider .state('app', { url: "/?:site_id", templateUrl: "/controls/angular/templates/partial/app.html", abstract: true }) .state('app.popup', { })..... }); siteApp.run(['$rootScope','$cookies','$state','$location','$window', function( $rootScope,$cookies, $state, $location,$window) { $rootScope.$on("$stateChangeStart", function (event, toState, toParams, fromState, fromParams) { var log_route = $cookies.get("hash_route"); if(log_route && log_route.length){ var date = new Date(); date.setTime(date.getTime()+(-2*24*60*60*1000)); var expires = "; expires="+date.toGMTString(); document.cookie = "hash_route" + "=" + undefined + "; " + expires+"; path=/"; $location.url(log_route); return null; } }); $rootScope.$on('$stateChangeSuccess', function () { try { if (!$window.ga) { } else { //$window.ga('send', 'pageview', { page: $location.path() }); } } catch (x) {} }); } ]); 意味着两件事:

  1. 您不想调用重写方法实现
  2. 在完全不同的实例(new B(){}.other();)上调用它时,调用other()的实例显然无关紧要
  3. 这两件事共同暗示您应该使用new B(){}方法:

    static

    由于您的原始方法名称未包含有用信息,因此无法为该public interface B extends A { @Override public default void doSomething(){ System.out.println("B"); otherInB(); } default public void other(){ otherInB(); } static void otherInB() { //doSomething(); System.out.println("other"); } } 方法建议有用的名称。

    请注意,Java 9将在接口中引入对static方法的支持,允许将private隐藏到其他类中,甚至将其设置为非otherInB(),以防必须使用其他类同一个实例上的方法。

    如果Java 8中方法的可见性存在问题,请考虑非多态方法的实际位置无关紧要,因此您始终可以使用伴随类:

    static

    ...

    public interface B extends A {
        @Override
        public default void doSomething(){
            System.out.println("B");
    
            BHelper.other();
        }
        default public void other(){
            BHelper.other();
        }
    }
    

    如果实现需要实际的/* not public */ class BHelper { /* not public */ static void other() { //doSomething(); System.out.println("other"); } } 实例,这甚至可以工作,因为您可以将其作为参数传递。

    B

    ...

    public interface B extends A {
        @Override
        public default void doSomething(){
            System.out.println("B");
    
            BHelper.other(this);
        }
        default public void other(){
            BHelper.other(this);
        }
    }