当前位置: 首页 > 知识库问答 >
问题:

不兼容类型:对象无法转换为Diff

子车勇锐
2023-03-14

我有一个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

我得到一个错误:

incompatible types: Object cannot be converted to Diff<?>

所以我有:

Required type:
Object

Provided:
Diff
<?>

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


共有3个答案

冯敏达
2023-03-14

如果您有一个泛型类型,比如DiffResult,但在声明中忽略了它的泛型类型,那么所有方法都会丢失它们的泛型信息。换句话说,如果将字段、变量或参数声明为DiffResult,而不是DiffResult

这可以用一个非常简单的例子来说明:

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

督坚白
2023-03-14

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

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

劳高爽
2023-03-14
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();
    }
}

这段代码编译起来没有任何问题,所以我不认为有什么问题。GetDiff返回一个Diff列表

 类似资料:
  • 我试图通过在一个单独的线程上进行工作并返回所需的对象来更改JavaFX中的GUI。然而,在完成工作和任务之后。setOnSucceeded()在尝试检索创建的对象时被触发,并出现错误“不兼容类型:对象无法转换为VideoScrollPane类型”。 我认为这与原始类型有关,因为这是在听众中发生的,但环顾四周后,我找不到我想要的建议。 任何可以散发的光芒都将不胜感激。

  • 问题内容: 我试图通过在单独的线程上进行工作并返回所需的对象来对JavaFX中的GUI进行更改。但是,在完成工作和task.setOnSucceeded()之后,我尝试检索创建的对象并得到错误“不兼容的类型:对象无法转换为VideoScrollPane类型”。 我认为这与原始类型有关,因为它发生在侦听器中,但是四处查看后,我找不到我想要的建议。 任何可以散发出的光将不胜感激。 问题答案: 这是因为

  • 当我想做Apk文件时,我得到了8个错误,我希望有人帮助我修复它 任务:app:CompileReleaseJavaWithJavac失败C:\codes\code\app\src\main\Java\com\insta\followers\tagsactivity.Java:61:错误:不兼容类型:视图无法转换为LinearLayout unitBanner=findViewById(r.id.u

  • 问题内容: 一般来说,对于Java和编程,我是一个新手。我正在尝试创建一个简单的程序,您可以在其中猜测我的年龄,如果您是对的,它将说“正确”,如果您错了,它将说“错”。 这是我的代码: 我收到错误消息“不兼容的类型:void无法转换为int”,但代码中没有void类?我知道我的代码可能很糟糕,但是如果你们能为我指出正确的方向,那就太好了。谢谢。 问题答案: 您的程序不必返回in 。相反,您可以将其

  • 我正在努力找出导致这个问题的原因。我对Java和BlueJ完全陌生,但我已经研究了几个小时,无法找出问题的原因。不断收到错误消息“不兼容类型:泥水匠无法转换为学徒”。非常感谢您的帮助。 //程序的目的:创建一个混合阵列,以容纳两个不同的学徒对象——泥水匠和木匠//泥水匠和木匠//然后将每个对象的所有细节显示在屏幕上。 学徒班就是这样的

  • 问题内容: 我试图在我的项目中使用对象数组,但出现错误: 在这条线上: 现在我不知道此错误的原因是什么。请帮我 。 问题答案: 您有两种方法,一种是将每个对象emt1,emt2,..强制转换为String,如下所示: 或者,您应该更改属性的类型: 到弦