我可以用接口作为参数来调用java方法吗?当我调用java方法时,我可以先把它投到接口中再作为参数吗?
这是我的示例代码。
// Java code
interface IFace {
String message();
}
class A implements IFace {
@Override message () { return "Hello A!"};
}
class B implements IFace {
@Override message () { return "Hello B!"};
}
class PrintHello {
static void print (IFace msg) {
if (msg instanceof A) { ... } else { ... }
}
}
; Clojure code
(def a (A.))
(. PrintHello (print a))
修改后的Java代码对我来说是可行的(见注释)。
public interface IFace {
String message();
}
// Class should be public
public class A implements IFace {
@Override
public String message() {
return "Hello A!";
}
}
// Class should be public
public class B implements IFace {
@Override
public String message() {
return "Hello B!";
}
}
public class PrintHello {
// Method should be public
static public void print (IFace msg) {
msg.message();
}
}
(def a (A.))
(PrintHello/print a)
这是你的代码的一个稍微干净的版本。
~/expr/demo > d **/*.java
-rw-rw-r-- 1 alan alan 136 May 5 13:42 src/java/demo/Bart.java
-rw-rw-r-- 1 alan alan 120 May 5 13:42 src/java/demo/Homer.java
-rw-rw-r-- 1 alan alan 62 May 5 13:37 src/java/demo/Msg.java
> more **/*.java
::::::::::::::
Msg.java
::::::::::::::
package demo;
public interface Msg {
public String msg();
}
::::::::::::::
Bart.java
::::::::::::::
package demo;
public class Bart implements Msg {
public Bart() {}
public String msg() {
return "Don't have a cow, man!";
}
}
::::::::::::::
Homer.java
::::::::::::::
package demo;
public class Homer implements Msg {
public Homer() {}
public String msg() {
return "Doh!";
}
}
Clojure代码:
(ns tst.demo.core
(:use demo.core tupelo.core tupelo.test)
(:import [demo Msg Homer Bart]))
(dotest
(let [homer (Homer.)
bart (Bart.)]
(spyx (.msg homer))
(spyx (.msg bart))))
与结果。
-------------------------------
Clojure 1.10.1 Java 14
-------------------------------
lein test tst.demo.core
(.msg homer) => "Doh!"
(.msg bart) => "Don't have a cow, man!"