英文:
Java string concatenation operation fails with "symbol not found: StringConcatFactory.makeConcatWithConstants"
问题 {#heading}
Specifically this line:
"Could not deserialize radio option from list" + Arrays.toString(items.toArray())
特别是这一行:
"Could not deserialize radio option from list" + Arrays.toString(items.toArray())
I'm in the process of upgrading Gradle to 8.2, Compose to 1.5.0, Kotlin to 1.9.0 (this feels like a possible culprit), Android Gradle Plugin to 8.1, and had to make updates to the Java/Kotlin JVM target.
我正在升级Gradle到8.2,Compose到1.5.0,Kotlin到1.9.0(这可能是问题的原因),Android Gradle插件到8.1,并且必须更新Java/Kotlin JVM目标。
Now I can obviously replace the code with
现在,我显然可以将代码替换为:
throw new IllegalArgumentException(new StringBuilder()
.append("Could not deserialize radio option from list")
.append(Arrays.toString(items.toArray()))
.toString());
Same in other Java code that has String concatenation
同样适用于其他具有字符串连接的Java代码:
throw new IllegalArgumentException(new StringBuilder()
.append(getClass())
.append(" cannot deserialize to ")
.append(typeOfT)
.toString());
But it seems somewhat eerie that ALL string concatenation operations done in Java with the +
operator would suddenly just "start failing".
但似乎有点不寻常的是,在Java中 使用+
运算符执行的所有字符串连接操作突然会开始失败。
Any clues what needs to be configured in order to prevent this error?
是否有任何线索可以配置以防止此错误?
error: cannot find symbol, symbol: method makeConcatWithConstants(Lookup,String,MethodType,String), location: interface StringConcatFactory
错误:找不到符号,符号:方法makeConcatWithConstants(Lookup,String,MethodType,String),位置:接口StringConcatFactory 英文:
I have the following Java snippet:
public static DetailChecklistFormDescriptor.ChecklistItemRadioField.RadioOption getRadioOptionFromList(List items, int position) {
Object item = items.get(position);
if(item instanceof DetailChecklistFormDescriptor.ChecklistItemRadioField.RadioOption) {
return (DetailChecklistFormDescriptor.ChecklistItemRadioField.RadioOption) item;
} else if(item instanceof com.google.gson.internal.LinkedTreeMap) {
return new DetailChecklistFormDescriptor.ChecklistItemRadioField.RadioOption(
(String) ((com.google.gson.internal.LinkedTreeMap) item).get("radioKey"),
(String) ((com.google.gson.internal.LinkedTreeMap) item).get("radioValue")
);
}
throw new IllegalArgumentException("Could not deserialize radio option from list" + Arrays.toString(items.toArray())); // <-- !!!
}
Specifically this line:
"Could not deserialize radio option from list" + Arrays.toString(items.toArray())
I'm in the process of upgrading Gradle to 8.2, Compose to 1.5.0, Kotlin to 1.9.0 (this feels like a possible culprit), Android Gradle Plugin to 8.1, and had to make updates to the Java/Kotlin JVM target.
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_17 // <-- was 1.8
}
kotlinOptions {
jvmTarget = "17" // <-- was 1.8
languageVersion = '1.9'
}
Now I can obviously replace the code with
throw new IllegalArgumentException(new StringBuilder()
.append("Could not deserialize radio option from list")
.append(Arrays.toString(items.toArray()))
.toString());
Same in other Java code that has String concatenation
throw new IllegalArgumentException(new StringBuilder()
.append(getClass())
.append(" cannot deserialize to ")
.append(typeOfT)
.toString());
But it seems somewhat eerie that ALL string concatenation operations done in Java with the +
operator would suddenly just "start failing".
Any clues what needs to be configured in order to prevent this error?
error: cannot find symbol,
symbol: method makeConcatWithConstants(Lookup,String,MethodType,String),
`location: interface StringConcatFactory
`
答案1 {#1}
得分: 1
设置更高的源兼容性(JavaVersion.VERSION_1_9
)允许代码编译。
之后,启用核心库 desugaring 是重要的,因为 Android 支持从 SDK 26 开始的 Java 8,而 Java 9+ 仅在较高的 API 级别上支持,因此必须启用核心库 desugaring。
结果如下:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_9
targetCompatibility JavaVersion.VERSION_17
coreLibraryDesugaringEnabled true
}
kotlinOptions {
jvmTarget = "17"
languageVersion = '1.9'
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
}
英文:
Setting a higher source compatibility (JavaVersion.VERSION_1_9
) allows for the code to compile.
Afterwards, it is important to enable core library desugaring, as Android supports Java 8 from SDK 26, and Java 9+ only at higher API levels, so core library desugaring must be enabled.
Result is:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_9
targetCompatibility JavaVersion.VERSION_17
coreLibraryDesugaringEnabled true
}
kotlinOptions {
jvmTarget = \"17\"
languageVersion = \'1.9\'
}
`dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
`