2017-10-27 7 views
0

私はClojureを初めて使用しており、ClojureへのJavaインターフェイスを実装しようとしています。具体的には、このコードプロキシを使用したClojureへのJavaインターフェイス

import javax.print.*; 

class Test { 

    public static void main (String [] args) 
    { 
     PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null); 
     System.out.println("Number of print services: " + printServices.length); 

     for (PrintService printer : printServices) 
      System.out.println("Printer: " + printer.getName()); 
    } 
} 
PrintService

インターフェイスとPrintServiceLookup constaructorクラスです。私はreifyとプロキシを使用する方法について混乱しています。私の目標は、システムにインストールされているプリンタを入手することです。 reifyやプロキシの使い方の例を説明できる人はいますか?ドキュメンテーションから、インタフェースをロードしてから使用したいメソッドをロードする必要があることを理解していますが、動作させることはできません。 私はそれを理解するJavaの観点から、PrintServiceLookup.lookupPrintServices()からオブジェクトを取得し、getName関数をPrintServiceインターフェイスから適用し、それを印刷する必要があります。 私はかなり確信している

(defn print-serv [] 
    (let [printS (proxy [PrintService PrintServiceLookup] [] 
     (getName []) 
       (lookupPrintServices []) 
    )] 
    (.println (System/out) (.getName printSe)) 
    ) 

    ) 

今まで私の試みは間違ってすべての方法ですが、私は誰もが、私は感謝されるより良い私にそれをexpainことができれば本当に、およびプロキシ作業を具体化する方法を理解することはできません!

答えて

2

投稿したJavaコードはインターフェースを実装していません。あなただけの静的メソッドを呼び出し、結果を反復処理しようとしているように見えます:

(let [printers (PrintServiceLookup/lookupPrintServices nil nil)] 
    (println "Number of print services:" (count printers)) 

    (doseq [^PrintService p, printers] 
    (println (.getName p))) 

doseqループはまた、単に書くことができます。

(doseq [p printers] 
    ...) 

私はちょうど^PrintServiceタイプのヒントが含まれて完全性のために。

また、完全な(.println (System/out) ...)を書く必要はありません。 Clojureにはprintlnのショートカットがあります。

+0

あなたは正しいと思いました。ありがとうございました!!しかし、実際には何が起こっているのですか? – narocath

+0

@narocath Np。嬉しいことに、 '^ PrintService'(' 'PrintService p、printers '')タイプヒントはオプションです。コンパイラに 'p'が' PrintService'であることを伝えるだけです。私は通常、interopを使用する際にはヒントを含みますが、オプションであってもタイプヒントを含めるのでIDEがより良い自動補完推測を行い、ヒントをスキップするとIDEが '.getName'を解決できないという警告を表示することがあり、実行時に反映が必要になります。 – Carcigenicate

+0

もう1つの質問があります。インターフェイスをロードする必要があります。この特定のケースでは、インターフェイスをロードするのは正しいでしょうか。インターフェイス全体を実装する必要があるときや、静的メソッドを呼び出す必要があるときはわかりません。 – narocath

関連する問題