将结果列表传递给Kotlin项目中的Java构造函数类



我是新来的。我正在为一个工作面试做项目。我已经在Kotlin中编写了该项目,但作为要求,我需要在Java中有一个文件。

我决定将从Kotlin的API接收电影数据列表的构造函数类转换为Java。现在我不确定如何将列表传递给它。

芬兰湾的科特林:

data class PopularMovies(
val results: List<Result>
)
data class Result(
val id: Int,    val overview: String,
val poster_path: String,
val release_date: String,
val title: String,
val vote_average: Double,
val vote_count: Int
)

Java:

import org.jetbrains.annotations.NotNull;
import java.util.List;
public class PopularMovies {
@NotNull
public final Object results;
public PopularMovies() {
results = null;
}
class Result {
private int id;
private String overview;
private String poster_path;
private String release_date;
private String title;
private Double vote_average;
private int vote_count;
public Result(
int id,
String overview,
String poster_path,
String release_date,
String title,
Double vote_average,
int vote_count) {
this.id = id;
this.overview = overview;
this.poster_path = poster_path;
this.release_date = release_date;
this.title = title;
this.vote_average = vote_average;
this.vote_count = vote_count;
}
}
}

我遇到的问题是当我点击适配器:

class MoviesAdapter(val movies: List<Result>): RecyclerView.Adapter<MoviesViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MoviesViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.movie_item, parent, false)
return MoviesViewHolder(view)
} ...

List<Result>下面有一条红线,错误:

One type argument expected for class Result<out T>
kotlin Result.class
@JvmInline
@SinceKotlin
public final value class Result<out T> : Serializable /* = Serializable */

Kotlin类型List<Result>类似于Java中的List<? extends Result>,尽管在Java中,如果不需要处理协方差,为了简洁起见,通常只使用List<Result>。无论哪种方式,都不完全相同,因为Java版本公开了用于更改列表的方法,因此您可能希望在字段或getter方法上放置一个Javadoc,以声明不应该更改list。你的类应该是这样的:

public class PopularMovies {
@NotNull
public final List<? extends Result> results;
public PopularMovies(List<? extends Result> results) {
this.results = results;
}
}

另一个问题是你的Result类被声明为你的PopularMovies类的内部类。这意味着它的实例不能与外部类的实例分开存在。您应该将其标记为static class或将其移动到自己的文件中。

当你在Kotlin中声明List<Result>类型时,如果你不把你的类移出PopularMovies,那么你需要在文件的顶部特别导入它,或者把外部类作为名称的一部分,例如List<PopularMovies.Result>。否则,它认为您正在使用同名的Kotlin标准库Result类,这是一个期望您指定类型的泛型类。

同样,在你的Result类中,你的字段应该是public final,或者它们应该是私有的,并且有getter方法公开,这样外部类可以实际获得它们的值。带有公共getter的私有字段是一种更推荐的方法,它可以直接等同于Kotlin代码。但是它要冗长得多。

你也应该将Double更改为double,因为它不应该持有空值。