-3

我有这个用于比较数据的 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
<?>

你知道我该如何解决这个问题吗?

4

3 回答 3

1

如果你有一个泛型类型,比如DiffResult,但你在声明中省略了它的泛型类型,那么所有方法都会丢失它们的泛型信息。换句话说,如果您将字段、变量或参数声明为DiffResult而不是DiffResult<WhatEverType>,则其getDiffs()方法不会返回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<?>

于 2022-02-24T12:34:40.480 回答
1

所以当我尝试它时,这对我有用。检查您是否导入了正确的库,清理并重新构建您的项目等。这里发生了一些有趣的事情。

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

于 2022-02-17T14:06:55.113 回答
1
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 在您的代码中返回 Diff<?>> 列表。

于 2022-02-20T14:02:15.980 回答