Clojure调用带有接口参数的java方法

问题描述 投票:0回答:1

我可以用接口作为参数来调用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))
clojure
1个回答
0
投票

修改后的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)

-1
投票

这是你的代码的一个稍微干净的版本。

~/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!"

请看 本模板工程文件资源清单.

© www.soinside.com 2019 - 2024. All rights reserved.