不兼容的类型:对象无法转换为 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可惜问题没有解决

我创建了这个小示例代码:

https://github.com/rcbandit111/hateos_poc/blob/main/src/main/java/com/hateos/test/assembler/CodeLogAssembler.java#L14

请问如何解决?

所以当我尝试时这对我有用。检查您是否导入了正确的库,对您的项目进行清理 re-build 等。这里发生了一些有趣的事情。

public class ListReturnType<X> {
   
   public static void main( String[] args ) {
      for( ListReturnType<?> x : getList() ) {
         
      }
   }
   
   public static List<ListReturnType<?>> getList() {
      return null;
   }
}

检查文档,虽然它们似乎匹配。

https://commons.apache.org/proper/commons-lang/apidocs/index.html?org/apache/commons/lang3/builder/DiffResult.html

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);
    }
  }
}