繁体   English   中英

是否可以在接口类中访问通用类型的方法?

[英]Is it possible to access methods of generic type in an interface class?

我想通过实现接口类来向类添加新方法,而不必每次都重写它。 我知道这听起来很荒谬,但请考虑以下示例:

public class Main {

    public static void main(String... args) {
        Subclass subclass = new Subclass();
        subclass.println("Hello");
        subclass.print("World!");
    }

    static abstract class Abstract {
        abstract void print(String message);
    }

    /**
     * I would like to add methods from this class to
     * whatever class that is a subclass of Abstract.
     */
    interface Interface<T extends Abstract> {
        default void println(String message) {
            System.out.println(message);
        }
    }

    static class Subclass extends Abstract implements Interface<Subclass> {
        @Override
        public void print(String message) {
            System.out.print(message);
        }
    }

}

因此,基本上,我想将Interface println方法添加到扩展Abstract类的任何类中。 这样,我们就以某种方式知道T类型。 但是我真正想在println里面做的是从T调用一个方法,该方法继承自Abstract类。 就像是:

interface Interface<T extends Abstract> {
    default void println(String message) {
        // I know that this WON'T work
        ((Abstract) T).print(message + "\n");
    }
}

我这样做的原因是,在不需要重写这些方法的意义上,使这些方法可重用(并节省重复的代码行)。 我知道这很荒谬,因为这听起来像是抽象类的字面用法,唯一的区别是,我们不能从多个类扩展。 无论如何,这只是我的结论。

那么,这可能吗? 或者可以在它完全不同的方式,而不是使用界面来完成? 任何想法?

如果您希望接口Interface的方法假定它在扩展Abstract的类型上并调用Abstract方法,则此方法应该起作用:

interface Interface {
    default void println(String message) {
        ((Abstract) this).print(message + "\n");
    }
}

假设您仅在扩展Abstract的类上实现接口。 如果尝试从不扩展Abstract的对象中调用println() ,则会得到强制转换异常。

您尝试执行的操作前后不一致。
所有Interface对象都不是Abstract实例。
是的,您可以声明一个实现InterfaceAbstract类,但也可以声明一个也实现InterfaceFoo类。

因此,铸造thisAbstract实在不是一个好主意,只会引发一个ClassCastException在运行时,如果this不是一个Abstract的实例:

default void println(String message) {
    // I know that this WON'T work
    ((Abstract) this).print(message + "\n");
}

实际上达到您的要求:

我想通过实现接口类来向类添加新方法,而不必每次都重写它。

您只需要一个东西:一个既定义要实现的方法又定义默认方法的接口:

interface Interface {
    default void println(String message) {
         this.print(message + "\n");
    }
    void print(String message);
}

子类将仅定义print()方法:

static class Subclass implements Interface {
    @Override
    public void print(String message) {
        System.out.print(message + " subclass way");
    }
}

static class OtherSubclass implements Interface {
    @Override
    public void print(String message) {
        System.out.print(message + " otherSubclass way");
    }
}

您可以通过以下方式使用它:

Interface subclass = new Subclass();
subclass.println("Hello");
subclass.print("World!");

Interface otherSubclass = new OtherSubclass();
otherSubclass.println("Hello");
otherSubclass.print("World!");

抽象类显得很无助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM