Clojure call java метод с параметрами интерфейса - PullRequest
0 голосов
/ 05 мая 2020

Могу ли я вызвать метод 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))

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Изменен 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)
0 голосов
/ 05 мая 2020

Вот немного более чистая версия вашего кода:

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

См. этот шаблон проекта и список ресурсов документации .

...