Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在不知道超类的情况下执行接口方法_Java - Fatal编程技术网

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) { .... }
}