公开属性和 Kotlin 数据的接口 类
Interfaces exposing properties and Kotlin data classes
我在 Kotlin 中得到了一个数据 class:
data class Image (val name: String, val url: URL) {}
我想通过 REST(Spring Boot、JPA)提供这些图像的列表,但我只想提供某些属性(在本例中只是名称,而不是 URL)。从我读过的内容来看,我需要使用投影 - 定义一个仅包含 'getName' 函数的接口:
interface HasName {
fun getName () : String
}
..然后设置数据 class 来实现这个,并让 RestController 服务 HasNames 而不是图像:
@GetMapping("/images")
fun getImages () : List <HasName> {
return imageService.getImages()
}
(或者这就是我在 Java 中所做的)。
但是,如果我在 Kotlin 中这样做:
data class Image (val name: String, val url: URL) : HasName {}
我收到一个错误:
Accidental override: The following declarations have the same JVM signature (getUrl()Ljava/net/URL;):
public final fun <
get-url>
(): URL defined in com.figmentsignage.server.data.campaign.Image
public abstract fun getUrl(): URL defined in com.figmentsignage.server.data.campaign.Image
有没有简单的方法解决这个问题?我可以给这个方法一个不同的名字,然后在 Image class 中重新定义它,但这有点乱。或者我可以在界面中定义 'name' 变量并在图像中覆盖它,再次凌乱。理想情况下,我希望尽可能少地更改图像 class。
这是我在 kotlin 中定义它们的方式,只需使用 name
属性(不需要 getName()
方法)并确保使用 override
关键词:
interface HasName {
val name: String
}
data class Image(override val name: String, val url: URL): HasName
我在 Kotlin 中得到了一个数据 class:
data class Image (val name: String, val url: URL) {}
我想通过 REST(Spring Boot、JPA)提供这些图像的列表,但我只想提供某些属性(在本例中只是名称,而不是 URL)。从我读过的内容来看,我需要使用投影 - 定义一个仅包含 'getName' 函数的接口:
interface HasName {
fun getName () : String
}
..然后设置数据 class 来实现这个,并让 RestController 服务 HasNames 而不是图像:
@GetMapping("/images")
fun getImages () : List <HasName> {
return imageService.getImages()
}
(或者这就是我在 Java 中所做的)。
但是,如果我在 Kotlin 中这样做:
data class Image (val name: String, val url: URL) : HasName {}
我收到一个错误:
Accidental override: The following declarations have the same JVM signature (getUrl()Ljava/net/URL;):
public final fun
<
get-url>
(): URL defined in com.figmentsignage.server.data.campaign.Image public abstract fun getUrl(): URL defined in com.figmentsignage.server.data.campaign.Image
有没有简单的方法解决这个问题?我可以给这个方法一个不同的名字,然后在 Image class 中重新定义它,但这有点乱。或者我可以在界面中定义 'name' 变量并在图像中覆盖它,再次凌乱。理想情况下,我希望尽可能少地更改图像 class。
这是我在 kotlin 中定义它们的方式,只需使用 name
属性(不需要 getName()
方法)并确保使用 override
关键词:
interface HasName {
val name: String
}
data class Image(override val name: String, val url: URL): HasName