在Clojure中实现接口并调用Java常量(新手)

时间:2012-05-25 07:04:32

标签: interface clojure java-interop

我正在尝试为Clojure中的google adwords api编写一个包装器,但是却遇到了常量和接口问题。 java代码如下所示:

CampaignServiceInterface campaignService =
    user.getService(AdWordsService.V201109.CAMPAIGN_SERVICE);

通常你可以用Clojure中的常量来调用常量。 (数学/ PI)但是当我写道:

(def user (AdWordsUser. ))
(.getService user (AdWordsService/V201109/CAMPAIGN_SERVICE))

我只是得到了#34;没有这样的命名空间"。 另外,我对如何正确实现接口有点无能为力。我想我应该使用" reify"但我卡住了

链接到界面: http://google-api-adwords-java.googlecode.com/svn-history/r234/trunk/docs/com/google/api/adwords/v201003/cm/CampaignServiceInterface.html

(defn campaign-service [ ]
(reify 
  com.google.adwords.api.v201109.cm.CampaignServiceInterface
  (get [this] ??))))

2 个答案:

答案 0 :(得分:4)

如果我正确阅读,AdWordsService.V201109.CAMPAIGN_SERVICE是AdWordsService类内部类的静态常量。

要访问内部类,您需要使用java的内部名称修改方案**;使用$符号将内部类与其外部类分开:

AdWordsService$V201109/CAMPAIGN_SERVICE

** JVM实际上并没有内部类的概念,所以java通过创建一个独立的类AdWordsService$V201109

来“假装”它

答案 1 :(得分:1)

1.关于访问常量。您导入AdWordsService了吗?如果不是,您可以使用完全限定名称访问AdWordsServicesome.package.name.AdWordsService/V201109/CAMPAIGN_SERVICE,也可以通过import宏进行导入。

2.查看示例:http://clojuredocs.org/clojure_core/clojure.core/reify

(defn campaign-service [ ]
(reify   
  com.google.adwords.api.v201109.cm.CampaignServiceInterface
  (get [_ selector] (some-function selector))
  (mutate [_ operations] (some-function-2 operations))))