首页 > 解决方案 > 将结果列表传递给 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 */

标签: javaandroid-studiokotlin

解决方案


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

public class PopularMovies {

    @NotNull
    public final List<? extends Result> results;

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

}

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

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

此外,在您的 Result 类中,您的字段应该是私有的public final,或者它们应该是私有的,并且公开了 getter 方法,以便外部类实际上可以获取它们的值。带有公共 getter 的私有字段是更推荐的方法,用于对您的类进行未来验证,它直接等效于 Kotlin 代码。但它更冗长。

您还应该更改Double为,double因为它不应该包含空值。


推荐阅读