【问题标题】:How to avoid kotlin factory class method by subtype?如何通过子类型避免kotlin工厂类方法?
【发布时间】:2018-01-15 14:26:52
【问题描述】:

我有一个关于 kotlin 的问题:

想象一下你有这个:

sealed class Graph : Serializable
data class Graph1() : Graph() {}
data class Graph2() : Graph() {}

你想要一个工厂类,给定一个 Graph 的子类型给你一个 GraphView。

所以,你有类似的东西

interface GraphViewFactory{
  fun get(data: Graph1):GraphView
  fun get(data: Graph2):GraphView
}

你也有实现。

在 kotlin 中是否有可能避免使用内联和具体化的每个图形类型都有一个接口的这种方法爆炸?我正在努力,但我做不到。

一方面,kotlin 接口(我认为)不允许内联函数,另一方面,即使没有接口,我也无法将参数 T 自动转换为工厂内的特定子类型类之一类。

【问题讨论】:

  • 你的故事不完整。 get 方法的返回类型是什么?它们都一样吗,只是GraphView?如果是,那么你真的没有问题。如果不是,并且您有 GraphView1GraphView2,那么您的输入和输出类型之间存在静态类型系统中无法表达的关系。
  • 抱歉,我已经更新了示例。是的,这两种方法都会返回 GraphView。
  • 你说没有问题是什么意思?我认为您将根据 when(param) 是 WhatEver 类型在工厂内转换类型,然后进行转换,但我正在尝试找到一种方法来避免使用 reified 和 inline 进行转换。 (只是好奇)
  • 那么,这有什么问题呢?你不能将Graph 传递给GraphView 并让它决定做什么,使用isas,可能吗?我仍然没有看到你的问题中真正的紧张,究竟是什么在困扰你。最终在GraphView 中,您必须知道它是哪种类型?或不?未解决的问题太多。

标签: java kotlin kotlin-reified-type-parameters


【解决方案1】:

您不必继续创建方法(尽管您可能需要根据创建 GraphView 的复杂程度来决定),但您的 when 中的案例数量将会增加。

class GraphViewFactory {
  fun get(data: Graph): GraphView {
     return when {
         is Graph1 -> TODO()
         is Graph2 -> TODO()
         else -> IllegalArgumentException()
     }
  }
}

在这里使用具体类型不会给您带来任何好处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多