Java 在不知道超类的情况下执行接口方法
这里我有一个预定义的类构造函数,它接受一个超类对象和一个谓词作为参数:Java 在不知道超类的情况下执行接口方法,java,Java,这里我有一个预定义的类构造函数,它接受一个超类对象和一个谓词作为参数: public Pathfinder(Character ch, Predicate<Character>) {// Code} 检查传递的字符是否实现UserControlable接口。我还需要访问usercontrolable接口isActive()中的布尔方法。如何使用谓词首先检查一个类是否实现了一个特定的接口,然后还从接口中调用一个方法(该方法在字符的所有子类中实现),而不能够编辑原始字符超类或Pathf
public Pathfinder(Character ch, Predicate<Character>) {// Code}
检查传递的字符是否实现UserControlable接口。我还需要访问usercontrolable接口isActive()中的布尔方法。如何使用谓词首先检查一个类是否实现了一个特定的接口,然后还从接口中调用一个方法(该方法在字符的所有子类中实现),而不能够编辑原始字符超类或Pathfinder类?听起来像
字符是您自己的类,这尤其令人讨厌,因为存在java.lang.Character
,当您创建与java.lang同名的类时,它会变得非常混乱。请重新命名
无论如何,如果您有:
public interface CadensInterface {
void foo();
}
public class CadensImpl1 implements CadensInterface {
public void foo() {}
}
public class CadensImpl2 implements CadensInterface {
public void foo() {}
}
然后您只需要一个强制转换操作,而不需要您的。usercontrolable.class.isAssignableFrom
malarky-这不是惯用法:
x -> {
if (x instanceof CadensInterface ci) {
ci.foo();
return true;
}
return false;
}
这就是使用java16特性。如果你还没走那么远:
x -> {
if (x instanceof CadensInterface) {
((CadensInterface) x).foo();
return true;
}
return false;
}
另一方面,如果您有以下情况:
public interface CadensInterface {
// no foo() method here
}
// some classes implementing CadensInterface,
// that all so happen to have a foo() method
然后,您不能这样做-java名义上是类型化的,没有“某个类中有foo()
方法”的概念。(有反思——但你真的,真的不想去那里)
例如,没有任何东西可以阻止某人编写一个实现CadenInterface的类,该类没有foo方法,因此java不允许您调用它
如果你认为java应该获得这个特性,请考虑这个概念:
public class Gun {
public void shoot(Person p) { .... }
}
public class Camera {
public void shoot(Person p) { .... }
}
这可能会让你明白为什么在引入“任何具有foo()方法的对象”作为类型的概念时会有些犹豫。这非常有效,谢谢!这些并不是我正在使用的实际类,只是我当时想出来的一些东西,试图重现我遇到的问题。
public class Gun {
public void shoot(Person p) { .... }
}
public class Camera {
public void shoot(Person p) { .... }
}