java - 将结果列表传递给 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 类型与 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
因为它不应该包含空值。
推荐阅读
- ruby - 为什么twitter API在文本末尾添加url
- html - 仅为 Angular 中的特定组件调用后端
- angular-material - 无法测试 Angular 材料数据表中的数据:TypeError:无法读取 null 的属性“nativeElement”
- python - Python Post 请求响应 Xml 错误加载 fromstring
- math - 将矩形分成n等份
- java - 使用 Jackson 序列化并在该字段上添加注释时,如何完全忽略字段的值?
- amazon-web-services - 如何在没有 OAI 的情况下使公共存储桶只能从云端访问?
- c - 从不断更新的日志文件中读取数据
- python - 如何删除 Pandas DataFrame 行中长度为 3 或更大的重复?
- reactjs - 如何使用 React 和 Redux 重置密码?