不兼容的类型:对象无法转换为 Diff<?>
incompatible types: Object cannot be converted to Diff<?>
我有他用来比较数据的Java方法:
org.apache.commons.lang3.builder.Diff;
public void addChangedPositions(DiffrentResult diffrentResult , List<UpdatedPositionsData> updatedPositionsData) {
for (Diff<?> diff : diffResult.getDiffs()) {
UpdatedPositionsData updatedData = new UpdatedPositionsData();
updatedData.setName(diff.getFieldName() == null ? null : diff.getFieldName());
updatedData.setOldValue(diff.getLeft() == null ? null : diff.getLeft().toString());
updatedData.setNewValue(diff.getRight() == null ? null : diff.getRight().toString());
updatedPositionsData.add(updatedField);
}
}
........
@Getter
@Setter
public class UpdatedPositionsData {
private String name;
private String oldValue;
private String newValue;
}
但是对于这一行for (Diff<?> diff : diffResult.getDiffs()) {
我收到错误:
incompatible types: Object cannot be converted to Diff<?>
所以我有:
Required type:
Object
Provided:
Diff
<?>
你知道我该如何解决这个问题吗?
P.S可惜问题没有解决
我创建了这个小示例代码:
请问如何解决?
所以当我尝试时这对我有用。检查您是否导入了正确的库,对您的项目进行清理 re-build 等。这里发生了一些有趣的事情。
public class ListReturnType<X> {
public static void main( String[] args ) {
for( ListReturnType<?> x : getList() ) {
}
}
public static List<ListReturnType<?>> getList() {
return null;
}
}
检查文档,虽然它们似乎匹配。
import lombok.*;
import org.apache.commons.lang3.builder.Diff;
import java.util.List;
@Getter
@Setter
public class UpdatedPositionsData {
private String name;
private String oldValue;
private String newValue;
public void addChangedPositions(DiffrentResult diffResult, List<UpdatedPositionsData> updatedPositionsData) {
for (Diff<?> diff : diffResult.getDiffs()) {
UpdatedPositionsData updatedData = new UpdatedPositionsData();
updatedData.setName(diff.getFieldName() == null ? null : diff.getFieldName());
updatedData.setOldValue(diff.getLeft() == null ? null : diff.getLeft().toString());
updatedData.setNewValue(diff.getRight() == null ? null : diff.getRight().toString());
updatedPositionsData.add(updatedData);
}
}
public interface DiffrentResult {
List<Diff<?>> getDiffs();
}
}
代码编译没有任何问题,所以我认为 diffResult.getDiffs returns 你的代码中没有 Diff>> 列表。
如果您有一个泛型类型,例如 DiffResult
,但您在声明中省略了它的泛型类型,那么所有方法都会丢失它们的泛型信息。换句话说,如果您将字段、变量或参数声明为 DiffResult
而不是 DiffResult<WhatEverType>
,那么它的 getDiffs()
方法不会 return List<Diff<?>>
而是List
- 没有任何通用信息。
这可以用一个非常简单的例子来说明:
class MyClass<T> {
List<String> strings() {
return List.of("a", "b", "c");
}
}
MyClass m = new MyClass(); // raw type warning ignored
List<String> strings = m.strings(); // compiler warning
for (String s : m.strings()) { // compiler error, like the one you're getting
}
所以我的猜测是,您在 DiffResult
中省略了通用类型。如果是这样,解决方法很简单:添加泛型类型,或者如果您不知道或不关心,请使用通配符:DiffResult<?>
.
更多指定的输入参数(DiffResult> diffResult)。我测试没有编译错误。
import java.util.List;
import org.apache.commons.lang3.builder.Diff;
import org.apache.commons.lang3.builder.DiffResult;
public class CodeLogAssembler {
private void addNewUpdatedFields(DiffResult<?> diffResult, List<UpdatedFieldsResource> updatedFields) {
for (Diff<?> diff : diffResult.getDiffs()) {
UpdatedFieldsResource updatedField = new UpdatedFieldsResource();
updatedField.setName(diff.getFieldName() == null ? null : diff.getFieldName());
updatedField.setOldValue(diff.getLeft() == null ? null : diff.getLeft().toString());
updatedField.setNewValue(diff.getRight() == null ? null : diff.getRight().toString());
updatedFields.add(updatedField);
}
}
}
我有他用来比较数据的Java方法:
org.apache.commons.lang3.builder.Diff;
public void addChangedPositions(DiffrentResult diffrentResult , List<UpdatedPositionsData> updatedPositionsData) {
for (Diff<?> diff : diffResult.getDiffs()) {
UpdatedPositionsData updatedData = new UpdatedPositionsData();
updatedData.setName(diff.getFieldName() == null ? null : diff.getFieldName());
updatedData.setOldValue(diff.getLeft() == null ? null : diff.getLeft().toString());
updatedData.setNewValue(diff.getRight() == null ? null : diff.getRight().toString());
updatedPositionsData.add(updatedField);
}
}
........
@Getter
@Setter
public class UpdatedPositionsData {
private String name;
private String oldValue;
private String newValue;
}
但是对于这一行for (Diff<?> diff : diffResult.getDiffs()) {
我收到错误:
incompatible types: Object cannot be converted to Diff<?>
所以我有:
Required type:
Object
Provided:
Diff
<?>
你知道我该如何解决这个问题吗?
P.S可惜问题没有解决
我创建了这个小示例代码:
请问如何解决?
所以当我尝试时这对我有用。检查您是否导入了正确的库,对您的项目进行清理 re-build 等。这里发生了一些有趣的事情。
public class ListReturnType<X> {
public static void main( String[] args ) {
for( ListReturnType<?> x : getList() ) {
}
}
public static List<ListReturnType<?>> getList() {
return null;
}
}
检查文档,虽然它们似乎匹配。
import lombok.*;
import org.apache.commons.lang3.builder.Diff;
import java.util.List;
@Getter
@Setter
public class UpdatedPositionsData {
private String name;
private String oldValue;
private String newValue;
public void addChangedPositions(DiffrentResult diffResult, List<UpdatedPositionsData> updatedPositionsData) {
for (Diff<?> diff : diffResult.getDiffs()) {
UpdatedPositionsData updatedData = new UpdatedPositionsData();
updatedData.setName(diff.getFieldName() == null ? null : diff.getFieldName());
updatedData.setOldValue(diff.getLeft() == null ? null : diff.getLeft().toString());
updatedData.setNewValue(diff.getRight() == null ? null : diff.getRight().toString());
updatedPositionsData.add(updatedData);
}
}
public interface DiffrentResult {
List<Diff<?>> getDiffs();
}
}
代码编译没有任何问题,所以我认为 diffResult.getDiffs returns 你的代码中没有 Diff>> 列表。
如果您有一个泛型类型,例如 DiffResult
,但您在声明中省略了它的泛型类型,那么所有方法都会丢失它们的泛型信息。换句话说,如果您将字段、变量或参数声明为 DiffResult
而不是 DiffResult<WhatEverType>
,那么它的 getDiffs()
方法不会 return List<Diff<?>>
而是List
- 没有任何通用信息。
这可以用一个非常简单的例子来说明:
class MyClass<T> {
List<String> strings() {
return List.of("a", "b", "c");
}
}
MyClass m = new MyClass(); // raw type warning ignored
List<String> strings = m.strings(); // compiler warning
for (String s : m.strings()) { // compiler error, like the one you're getting
}
所以我的猜测是,您在 DiffResult
中省略了通用类型。如果是这样,解决方法很简单:添加泛型类型,或者如果您不知道或不关心,请使用通配符:DiffResult<?>
.
更多指定的输入参数(DiffResult> diffResult)。我测试没有编译错误。
import java.util.List;
import org.apache.commons.lang3.builder.Diff;
import org.apache.commons.lang3.builder.DiffResult;
public class CodeLogAssembler {
private void addNewUpdatedFields(DiffResult<?> diffResult, List<UpdatedFieldsResource> updatedFields) {
for (Diff<?> diff : diffResult.getDiffs()) {
UpdatedFieldsResource updatedField = new UpdatedFieldsResource();
updatedField.setName(diff.getFieldName() == null ? null : diff.getFieldName());
updatedField.setOldValue(diff.getLeft() == null ? null : diff.getLeft().toString());
updatedField.setNewValue(diff.getRight() == null ? null : diff.getRight().toString());
updatedFields.add(updatedField);
}
}
}