Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
clojure java interop for com.google.cloud.storage.StorageImpl_Java_Clojure_Google Cloud Platform_Clojure Java Interop - Fatal编程技术网

clojure java interop for com.google.cloud.storage.StorageImpl

clojure java interop for com.google.cloud.storage.StorageImpl,java,clojure,google-cloud-platform,clojure-java-interop,Java,Clojure,Google Cloud Platform,Clojure Java Interop,尝试使用带有字节数组的create方法进行java互操作 我的答复中有: user=> (->> s r/reflect :members (filter #(instance? clojure.reflect.Method %)) (filter #(:public (:flags %))) (filter #(= (str (:name %)) "create"))

尝试使用带有字节数组的
create
方法进行java互操作

我的答复中有:

user=> (->> s r/reflect :members 
               (filter #(instance? clojure.reflect.Method %)) 
               (filter #(:public (:flags %))) 
               (filter #(= (str (:name %)) "create")) 
               (print-table [:name :flags :parameter-types]))

|  :name |              :flags |                                                                                           :parameter-types |
|--------+---------------------+------------------------------------------------------------------------------------------------------------|
| create | #{:varargs :public} |             [com.google.cloud.storage.BlobInfo byte<> com.google.cloud.storage.Storage$BlobTargetOption<>] |
但是当我去调用
.create
,我得到:

user=> (.create s blob-info (bytes b))

java.lang.IllegalArgumentException: No matching method create found taking 2 args for class com.google.cloud.storage.StorageImpl
如果我尝试添加
nil
作为第三个参数,我会在
3个参数中得到相同的错误

我是不是漏掉了什么明显的东西?谢谢

编辑:非常相似,而且更通用(这很好)。这是一个关于一个特定的
创建
函数签名的特定问题。

我不确定
(字节b)
是正确的语法(whidbey/bin是什么?)

也许试试

(byte-array [1 2 3]) 
或类似的。您也可以尝试键入提示参数:

(.create s 
    blob-info
    ^"[B" (byte-array [1 2 3])    ; type-hinted param
)

更新 下面是一个暗示类型的示例,我认为您需要:

(let [byte-array-obj  (byte-array [1 2 3])
      sss             (java.util.Arrays/toString  ^"[B"  byte-array-obj) ]
    (spyxx byte-array-obj)
    (spyx (type byte-array-obj))
    (spyx (aget byte-array-obj 2))
    (spyx sss))
结果:

byte-array-obj => <#[B #object["[B" 0x26071f95 "[B@26071f95"]>
(type byte-array-obj) => [B
(aget byte-array-obj 2) => 3
sss => "[1, 2, 3]"
两者都是等价的。

答案是(来自clojurians slack上的seancorfield),
blob info
是一个
BuilderImpl
内部类,需要是一个实际的
BlobInfo
。有效的代码:

(defn get-storage []
  (-> (StorageOptions/getDefaultInstance)
      (.getService)))

(defn get-blob-info [bucket storage-key]
  (let [content-type "text/plain"
        blob-id (BlobId/of bucket storage-key)
        builder (doto
                  (BlobInfo/newBuilder blob-id)
                  (.setContentType content-type))]

    (.build builder)))

(defn upload-str [bucket storage-key str-to-store]
  (let [storage (get-storage)
        blob-info (get-blob-info bucket storage-key)
        byte-arr (.getBytes str-to-store)]
    (.create storage
             blob-info
             byte-arr
             (into-array Storage$BlobTargetOption []))))

不需要类型暗示结束-只需要类型正确排列。

-它与我从docker容器使用的repl一起提供。强制转换到字节数组并没有起到作用。这似乎与clojure能够通过其签名找到类上的函数有关,而我在确定正确的咒语方面遇到了问题。您喜欢的函数的可能副本没有使用两个参数,而是使用三个参数。在java中,您只需使用两个参数就可以调用它,因为编译器会负责。JVM总是接受第三个参数;这种类型的数组,即使emptyAah很高兴发现这一点!谢谢
(java.util.Arrays/toString ^"[B"  byte-array-obj)  ; type hint using a string
(java.util.Arrays/toString ^bytes byte-array-obj)  ; Clojure "build-in" type hint 
(defn get-storage []
  (-> (StorageOptions/getDefaultInstance)
      (.getService)))

(defn get-blob-info [bucket storage-key]
  (let [content-type "text/plain"
        blob-id (BlobId/of bucket storage-key)
        builder (doto
                  (BlobInfo/newBuilder blob-id)
                  (.setContentType content-type))]

    (.build builder)))

(defn upload-str [bucket storage-key str-to-store]
  (let [storage (get-storage)
        blob-info (get-blob-info bucket storage-key)
        byte-arr (.getBytes str-to-store)]
    (.create storage
             blob-info
             byte-arr
             (into-array Storage$BlobTargetOption []))))