有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从Java代码转换时出现Kotlin错误

我有一个ArraysHelper类,在Java中看起来像这样:

public class ArraysHelper<T> {

  public final Iterable<T> iterable;

  private ArraysHelper(Iterable<T> iterable) {
    this.iterable = iterable;
  }

  public static <T> T[] concat(T[] array, @Nullable T element) {
    T[] result = Arrays.copyOf(array, array.length + 1);
    result[array.length] = element;
    return result;
  }

  public final ArraysHelper<T> filter(Prediction<T> prediction) {
    return from(filter(iterable, prediction));
  }

  private static <T> List<T> filter(Iterable<T> iterable, Prediction<T> predicate) {
    ArrayList<T> list = new ArrayList<>();
    for (T object : iterable) {
        if (predicate.apply(object)) {
            list.add(object);
        }
    }

    return list;
  }

  public final List<T> toList() {
    List<T> list = new ArrayList<>();
    for (T item : iterable) {
        list.add(item);
    }
    return list;
  }

  public static <T> ArraysHelper<T> from(final Iterable<T> iterable) {
    return new ArraysHelper<>(iterable);
  }
}

我将其转换为Kotlin,如下所示:

class ArraysHelper<T> private constructor(val iterable: Iterable<T>) {

  fun filter(prediction: Prediction<T>): ArraysHelper<T> {
    return from(filter(iterable, prediction))
  }

  fun toList(): ArrayList<T> {
    val list = ArrayList<T>()
    for (item in iterable) {
        list.add(item)
    }
    return list
  }

  companion object {

    fun <T> concat(array: Array<T>, element: T?): Array<T> {
        val result = Arrays.copyOf(array, array.size + 1)
        result[array.size] = element
        return result
    }

    private fun <T> filter(iterable: Iterable<T>, predicate: Prediction<T>): ArrayList<T> {
        val list = ArrayList<T>()
        for (`object` in iterable) {
            if (predicate.apply(`object`)) {
                list.add(`object`)
            }
        }

        return list
    }


    fun <T> from(iterable: Iterable<T>): ArraysHelper<T> {
        return ArraysHelper(iterable)
    }
  }
}

我还转换了我正在使用的一个接口。在java中:

public interface Prediction<T> {

  boolean apply(@Nullable T input);

  @Override
  boolean equals(@Nullable Object object);
}

在科特林:

interface Prediction<T> {

  fun apply(input: T?): Boolean

  override fun equals(`object`: Any?): Boolean
}

现在说到重点——我想在这里使用这些:

 val rssiEvents = locationRSSIEvents
    if (rssiEvents.isNotEmpty()) {
        val latestRSSIEvent = rssiEvents.last()

        val cleanedGeoEvents = ArraysHelper.from<LocationGeoEvent>(locationGeoEvents).filter(object : Prediction<LocationGeoEvent> {
            override fun apply(input: LocationGeoEvent): Boolean {
                return Math.abs(input.timestamp - latestRSSIEvent.timestamp) < maxTimeDifferenceSeconds * 1000
            }
        }).toList()

    }

但在IDE(Android Studio 3.0)中,强调了过滤方法:

object : Prediction<LocationGeoEvent>

上面写着:

Required: Prediction<LocationGeoEvent> Found: 

那么,它到底出了什么问题

更新:

当然,在科特林,我可以做这样的事情:

    val cleanedGeoEvents = locationGeoEvents
                .filter { locationGeoEvent -> Math.abs(locationGeoEvent.timestamp - latestRSSIEvent.timestamp) < maxTimeDifferenceSeconds * 1000 }
                .toList()

但是,这仍然是有用的,这之前的版本到底出了什么问题


共 (0) 个答案