带备选方案的重载方法值表

时间:2017-11-23 15:19:48

标签: java scala apache-kafka apache-kafka-streams

我有以下编译器抱怨的代码:

pip uninstall virtualenvwrapper
pip3 install virtualenv virtualenvwrapper

错误讯息:

val state: KTable[String, String]  = builder
  .table("BARY-PATH", Materialized.as("PATH-STORE"))

然后我尝试了:

[error] /home/developer/Desktop/microservices/paths-stream/src/main/scala/io/khinkali/PathsTopology.scala:23:8: overloaded method value table with alternatives:
[error]   [K, V](x$1: String, x$2: org.apache.kafka.streams.kstream.Materialized[K,V,org.apache.kafka.streams.state.KeyValueStore[org.apache.kafka.common.utils.Bytes,Array[Byte]]])org.apache.kafka.streams.kstream.KTable[K,V] <and>
[error]   [K, V](x$1: String, x$2: org.apache.kafka.streams.Consumed[K,V])org.apache.kafka.streams.kstream.KTable[K,V]
[error]  cannot be applied to (String, org.apache.kafka.streams.kstream.Materialized[Nothing,Nothing,Nothing])
[error]       .table("BARY-PATH", Materialized.as("PATH-STORE"))
[error]        ^

编译器仍然抱怨:

val state: KTable[String, String]  = builder
  .table[String, String]("BARY-PATH", Materialized[String, String,KeyValueStore[org.apache.kafka.common.utils.Bytes, Array[Byte]]].as("PATH-STORE"))

我读了API docs,但无法想象,我做错了什么?

方法实施:

[error] /home/developer/Desktop/microservices/paths-stream/src/main/scala/io/khinkali/PathsTopology.scala:24:43: object org.apache.kafka.streams.kstream.Materialized is not a value
[error]       .table[String, String]("BARY-PATH", Materialized[String, String,KeyValueStore[org.apache.kafka.common.utils.Bytes, Array[Byte]]].as("PATH-STORE"))

在Java中,我做了

 * Materialize a {@link StateStore} with the given name.
 *
 * @param storeName  the name of the underlying {@link KTable} state store; valid characters are ASCII
 * alphanumerics, '.', '_' and '-'.
 * @param <K>       key type of the store
 * @param <V>       value type of the store
 * @param <S>       type of the {@link StateStore}
 * @return a new {@link Materialized} instance with the given storeName
 */
public static <K, V, S extends StateStore> Materialized<K, V, S> as(final String storeName) {
    Topic.validate(storeName);
    return new Materialized<>(storeName);
} 

它就像一个魅力。

1 个答案:

答案 0 :(得分:4)

尝试在as方法之后移动泛型类型规范:

val state: KTable[String, String]  = builder
    .table[String, String]("BARY-PATH", Materialized.as[String, String,KeyValueStore[org.apache.kafka.common.utils.Bytes, Array[Byte]]]("PATH-STORE"))
从Java签名中可以看出,对于静态方法,您应该为方法而不是类指定泛型类型。