带泛型的Kotlin静态工厂方法

xxe27gdn  于 2023-01-26  发布在  Kotlin
关注(0)|答案(1)|浏览(140)

发现了一些类似的东西,我想实现的java-java generics and static methodsimplementing factory pattern with generics in java from baeldung
在我的例子中,我也想把工厂作为一个静态方法,但不确定如何在Kotlin中实现它,或者整个概念都是错误的。简言之,Notifiers有特定的类型,每个类型都应该处理特定的NotificationInput类型。基本上,它们也是某种构建器,因为它们从输入构建Notification对象。
考虑到下面的设置,我得到了Type mismatch. Required: Notifier<T> Found: DebugNotifier(其他Notifier实现也是如此)。

interface Notifier<T> {
   fun issue(p: NotificationInput<T>): Notification

   companion object {
      fun <T> getNotifier(p: NotifierParameter): Notifier<T> = when(p.type){
          "0" -> DebugNotifier()
          "1" -> InfoNotifier()
          "2" -> ErrorNotifier()
      }
}
class DebugNotifier: Notifier<Debug>{
   override fun issue(p: NotificationInput<Debug>): Notification{
      return Notification(
         somField = p.someDebugFieldValue
      )
   }
}
data class NotificationInput<T>(
   val data: T
)

我打算这样称呼它:Notifier.getNotifier<Debug>(notifierParameter).issue(notificationInput)
如何实现这一点,或者什么是更好的配置?

ffdz8vbo

ffdz8vbo1#

正如@broot已经解释的,调用者在这里可以控制两件事情:类型参数TNotifierParameter参数,所以API有点损坏,因为调用者可以:

Notifier.getNotifier<Debug>(NotifierParameter("2"))

你觉得这里会发生什么?
getNotifier()的输入中有太多的自由度,因此编译器不允许您在接收"2"时返回ErrorNotifier(),因为有人可能将<Debug>作为类型参数传递。
您不能将这种API与Java进行比较,因为Java的泛型是破坏性的,允许一些没有意义的东西。

相关问题