发现了一些类似的东西,我想实现的java-java generics and static methods也implementing 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)
如何实现这一点,或者什么是更好的配置?
1条答案
按热度按时间ffdz8vbo1#
正如@broot已经解释的,调用者在这里可以控制两件事情:类型参数
T
和NotifierParameter
参数,所以API有点损坏,因为调用者可以:你觉得这里会发生什么?
在
getNotifier()
的输入中有太多的自由度,因此编译器不允许您在接收"2"
时返回ErrorNotifier()
,因为有人可能将<Debug>
作为类型参数传递。您不能将这种API与Java进行比较,因为Java的泛型是破坏性的,允许一些没有意义的东西。