kotlin:期待menber声明,而我似乎已经这样做了

ejk8hzay  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(616)

我发现了一些带有相同错误信息的问题,但据我所知,我已经正确地声明了它。
以下是kotlin的全部代码:

  1. package com.mybank.service
  2. import org.reactivestreams.Publisher
  3. import com.mongodb.client.result.InsertOneResult
  4. import com.mongodb.reactivestreams.client.MongoClients
  5. import com.mongodb.reactivestreams.client.MongoClient
  6. import com.mongodb.reactivestreams.client.MongoCollection
  7. import com.mongodb.reactivestreams.client.MongoDatabase
  8. import java.util.Arrays
  9. import org.bson.Document
  10. class test {
  11. //MongoClient mongoClient = MongoClients.create();
  12. var mongoClient: MongoClient = MongoClients.create("mongodb://root:q@localhost:27017")
  13. var database: MongoDatabase = mongoClient.getDatabase("mydb")
  14. var collection: MongoCollection<Document> = database.getCollection("mycollection")
  15. var doc: Document = Document("name", "MongoDB")
  16. .append("type", "database")
  17. .append("count", 1)
  18. .append("versions", Arrays.asList("v3.2", "v3.0", "v2.6"))
  19. .append("info", Document("x", 203).append("y", 102))
  20. //publisher decalred and initialized
  21. var publisher: Publisher<InsertOneResult> = collection.insertOne(doc)
  22. publisher***why publisher isn't initialized yet???

它在java中就是这样工作的

  1. imports ommited, same as above
  2. public class App {
  3. public static void main(String[] args) throws Throwable {
  4. //MongoClient mongoClient = MongoClients.create();
  5. MongoClient mongoClient = MongoClients.create("mongodb://root:q@localhost:27017");
  6. MongoDatabase database = mongoClient.getDatabase("mydb");
  7. MongoCollection<Document> collection = database.getCollection("mycollection");
  8. Document doc = new Document("name", "MongoDB")
  9. .append("type", "database")
  10. .append("count", 1)
  11. .append("versions", Arrays.asList("v3.2", "v3.0", "v2.6"))
  12. .append("info", new Document("x", 203).append("y", 102));
  13. Publisher<InsertOneResult> publisher = collection.insertOne(doc);
  14. publisher.subscribe(new Subscriber<InsertOneResult>() {
  15. @Override
  16. public void onSubscribe(final Subscription s) {
  17. s.request(1); // <--- Data requested and the insertion will now occur
  18. }
  19. @Override
  20. public void onNext(final InsertOneResult result) {
  21. System.out.println("Inserted: " + result);
  22. }
  23. @Override
  24. public void onError(final Throwable t) {
  25. System.out.println("Failed");
  26. }
  27. @Override
  28. public void onComplete() {
  29. System.out.println("Completed");
  30. }
  31. });
  32. //all examples
  33. collection.countDocuments()
  34. .subscribe(new SubscriberHelpers.PrintSubscriber<Long>("total # of documents after inserting "
  35. + " is: %s"));
  36. collection.find(eq("name", "MongoDB")).first().subscribe(new SubscriberHelpers.PrintDocumentSubscriber());
  37. Thread.sleep(1000);
  38. }
  39. }

错误消息:

我不是为android编写代码,这里是build.gradle,尽管我认为它不相关

  1. plugins {
  2. id "org.jetbrains.kotlin.jvm" version "1.3.72"
  3. id "org.jetbrains.kotlin.kapt" version "1.3.72"
  4. id "org.jetbrains.kotlin.plugin.allopen" version "1.3.72"
  5. id "application"
  6. id 'com.google.protobuf' version '0.8.13'
  7. }
  8. version "0.2"
  9. group "account-control"
  10. repositories {
  11. mavenLocal()
  12. jcenter()
  13. }
  14. configurations {
  15. // for dependencies that are needed for development only
  16. developmentOnly
  17. }
  18. dependencies {
  19. kapt(enforcedPlatform("io.micronaut:micronaut-bom:$micronautVersion"))
  20. kapt("io.micronaut:micronaut-inject-java")
  21. kapt("io.micronaut:micronaut-validation")
  22. implementation(enforcedPlatform("io.micronaut:micronaut-bom:$micronautVersion"))
  23. implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlinVersion}")
  24. implementation("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}")
  25. implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinxCoroutinesVersion")
  26. implementation("io.micronaut:micronaut-runtime")
  27. // implementation("io.micronaut.grpc:micronaut-grpc-runtime")
  28. implementation("io.micronaut.grpc:micronaut-grpc-server-runtime:$micronautGrpcVersion")
  29. implementation("io.micronaut.grpc:micronaut-grpc-client-runtime:$micronautGrpcVersion")
  30. implementation("io.grpc:grpc-kotlin-stub:${grpcKotlinVersion}")
  31. //Kafka
  32. implementation("io.micronaut.kafka:micronaut-kafka")
  33. //vertx
  34. implementation("io.micronaut.sql:micronaut-vertx-mysql-client")
  35. //implementation("io.micronaut.configuration:micronaut-vertx-mysql-client")
  36. compile 'io.vertx:vertx-lang-kotlin:3.9.4'
  37. //mongodb
  38. implementation("org.mongodb:mongodb-driver-reactivestreams:4.1.1")
  39. runtimeOnly("ch.qos.logback:logback-classic:1.2.3")
  40. runtimeOnly("com.fasterxml.jackson.module:jackson-module-kotlin:2.9.8")
  41. kaptTest("io.micronaut:micronaut-inject-java")
  42. testImplementation enforcedPlatform("io.micronaut:micronaut-bom:$micronautVersion")
  43. testImplementation("org.junit.jupiter:junit-jupiter-api:5.3.0")
  44. testImplementation("io.micronaut.test:micronaut-test-junit5")
  45. testImplementation("org.mockito:mockito-junit-jupiter:2.22.0")
  46. testRuntime("org.junit.jupiter:junit-jupiter-engine:5.3.0")
  47. testRuntime("org.jetbrains.spek:spek-junit-platform-engine:1.1.5")
  48. }
  49. test.classpath += configurations.developmentOnly
  50. mainClassName = "account-control.Application"
  51. test {
  52. useJUnitPlatform()
  53. }
  54. allOpen {
  55. annotation("io.micronaut.aop.Around")
  56. }
  57. compileKotlin {
  58. kotlinOptions {
  59. jvmTarget = '11'
  60. //Will retain parameter names for Java reflection
  61. javaParameters = true
  62. }
  63. }
  64. //compileKotlin.dependsOn(generateProto)
  65. compileTestKotlin {
  66. kotlinOptions {
  67. jvmTarget = '11'
  68. javaParameters = true
  69. }
  70. }
  71. tasks.withType(JavaExec) {
  72. classpath += configurations.developmentOnly
  73. jvmArgs('-XX:TieredStopAtLevel=1', '-Dcom.sun.management.jmxremote')
  74. }
  75. sourceSets {
  76. main {
  77. java {
  78. srcDirs 'build/generated/source/proto/main/grpc'
  79. srcDirs 'build/generated/source/proto/main/grpckt'
  80. srcDirs 'build/generated/source/proto/main/java'
  81. }
  82. }
  83. }
  84. protobuf {
  85. protoc { artifact = "com.google.protobuf:protoc:${protocVersion}" }
  86. plugins {
  87. grpc { artifact = "io.grpc:protoc-gen-grpc-java:${grpcVersion}" }
  88. grpckt { artifact = "io.grpc:protoc-gen-grpc-kotlin:${grpcKotlinVersion}" }
  89. }
  90. generateProtoTasks {
  91. all()*.plugins {
  92. grpc {}
  93. grpckt {}
  94. }
  95. }
  96. }

***编辑

  1. package com.mybank.service
  2. import org.reactivestreams.Publisher
  3. import com.mongodb.client.result.InsertOneResult
  4. import com.mongodb.reactivestreams.client.MongoClients
  5. import com.mongodb.reactivestreams.client.MongoClient
  6. import com.mongodb.reactivestreams.client.MongoCollection
  7. import com.mongodb.reactivestreams.client.MongoDatabase
  8. import java.util.Arrays
  9. import org.bson.Document
  10. import javax.inject.Singleton
  11. class test {
  12. //MongoClient mongoClient = MongoClients.create();
  13. var mongoClient: MongoClient = MongoClients.create("mongodb://root:q@localhost:27017")
  14. var database: MongoDatabase = mongoClient.getDatabase("mydb")
  15. var collection: MongoCollection<Document> = database.getCollection("mycollection")
  16. var doc: Document = Document("name", "MongoDB")
  17. .append("type", "database")
  18. .append("count", 1)
  19. .append("versions", Arrays.asList("v3.2", "v3.0", "v2.6"))
  20. .append("info", Document("x", 203).append("y", 102))
  21. //publisher decalred and initialized
  22. var publisher: Publisher<InsertOneResult> = collection.insertOne(doc)
  23. }

然后在另一节课上

  1. @Singleton
  2. class TransactionService(){
  3. @Inject
  4. lateinit var test: test
  5. fun postDebitTransaction(debit: String) : String{
  6. test.publisher.subscribe(
  7. object x: Subscriber<InsertOneResult> {
  8. override fun onSubscribe(s: Subscription) {
  9. s.request(1) // <--- Data requested and the insertion will now occur
  10. }
  11. override fun onNext(result: InsertOneResult) {
  12. println("Inserted: $result")
  13. }
  14. override fun onError(t: Throwable) {
  15. println("Failed")
  16. }
  17. override fun onComplete() {
  18. println("Completed")
  19. }
  20. })
  21. return "posted"
  22. }
  23. }

而我正在
类型不匹配。必需:订阅服务器<in insertoneresult!>!
我确信我在Kotlin犯了些愚蠢的错误

vlurs2pr

vlurs2pr1#

编译器并没有告诉您成员没有初始化,而是告诉您,如果函数不是成员声明的一部分,就不允许调用类主体中的函数。
例如

  1. class Foo {
  2. // not allowed
  3. 3.toString()
  4. }
  5. class Bar {
  6. // prefectly fine
  7. val three = 3.toString()
  8. }

java也有同样的行为。java示例之所以能够工作,是因为您的代码在 main 方法而不是类主体。

相关问题