公开属性和 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