[英]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
实例。
是的,您可以声明一个实现Interface
的Abstract
类,但也可以声明一个也实现Interface
的Foo
类。
因此,铸造this
给Abstract
实在不是一个好主意,只会引发一个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.