95772


以下のようなコードを作ったのですが（japanizeやkanaProvider.parseなど、importしないといけないところは無視してください）どうしてもcompileの段階でエラーが発生してしまいます。java初心者なのでよくわからないのですがなるべく簡単にわかりやすく教えてもらえると助かります！お願いします！

**エラーメッセージ:**

[code]

     エラー: シンボルを見つけられません
            .thenApply(this::parse)
            ^
      シンボル:   メソッド thenApply(this::parse)
      場所: クラス java.lang.String
    
[/code]

**現状のコード:**

[code]

    public CompletableFuture convert(String kana) {
            String japanized = Japanizer.japanize(kana);
            if (japanized.isEmpty()) {
                    return CompletableFuture.completedFuture(kana);
            } else {
                    return kanaProvider.parse(japanized).thenApply(this::parse).exceptionally(e - > {
                            LOGGER.warn("API returned unexpected result:", e);
                            return "";
                    }).thenApply(text - > text.isEmpty() ? (japanized.isEmpty() ? kana : japanized) : text);
            }
    }
    public String parse(String value) {
            String result = this.kanaProvider.parse(value);
            return result;
    }
    
[/code]

追記

[code]

    public Provider kanaProvider = Providers.get();
    
[/code]

kanaProviderはこのように定義してあります。また、Providerは、

[code]

    public interface Provider extends Closeable {
       CompletableFuture<String> fetch(Kanaifier var1, String var2);
    
       default String parse(String value) {
          return value;
       }
    
       default boolean isUsable() {
          return true;
       }
    
       default String getName() {
          return this.getClass().getName();
       }
    
       public void close();
    }
    
[/code]

Providersは、

[code]

    public enum Providers {
       YAHOO_KANA_API,
       GOOGLE_IME;
    
       private Providers() {
       }
    
       public Provider getInstance() {
          throw new AbstractMethodError();
       }
    
       public boolean isUsable() {
          return this.getInstance().isUsable();
       }
    
       public static Provider get() {
          Providers[] var0 = values();
          int var1 = var0.length;
    
          for(int i = 0; i < var1; ++i) {
             Providers provider = var0[i];
             if (provider.isUsable()) {
                return provider.getInstance();
             }
          }
    
          Kanaifier.LOGGER.warn("No provider available, using fallback");
          return NoopProvider.INSTANCE;
       }
    }
    
[/code]

のようになっています。importはめんどくさいので書きません。回答お願いします。


CC BY-SA 4.0
2023-07-26T02:13:25.387
95756
2023-07-26T19:56:35.423
2023-07-26T19:29:01.423
2808
59255
question
java
thenApplyでエラーが起きる


`kanaProvider.parse(japanized)` の戻り値の型は `String` です。  
`String` には [`thenApply()`
というメソッドは備わっていない](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/lang/String.html)にも関わらずそのメソッドを呼び出そうとしているので

>
[code]

>      エラー: シンボルを見つけられません
>             .thenApply(this::parse)
>             ^
>       シンボル:   メソッド thenApply(this::parse)
>       場所: クラス java.lang.String
>  
[/code]

というエラーが出ています。

想定される正しいコードは次のようなものでは:

[code]

                return CompletableFuture.supplyAsync(() -> kanaProvider.parse(japanized)).thenApply(this::parse).exceptionally(e -> {
                    LOGGER.warn("API returned unexpected result:", e);
                    return "";
                }).thenApply(text -> text.isEmpty() ? (japanized.isEmpty() ? kana : japanized) : text);
    
[/code]


CC BY-SA 4.0
2023-07-26T19:56:35.423
95772
2023-07-26T19:56:35.423
2808
95756
answer