当前位置: 首页 > 知识库问答 >
问题:

如何通过子类型避免kotlin工厂类方法?

池宸
2023-03-14

我有一个关于科特林的问题:

sealed class Graph : Serializable
data class Graph1() : Graph() {}
data class Graph2() : Graph() {}
interface GraphViewFactory{
  fun get(data: Graph1):GraphView
  fun get(data: Graph2):GraphView
}

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

一方面,kotlin接口(我认为)不允许内联函数,另一方面,即使没有该接口,我也不能自动强制转换参数T,将其具体化为工厂类中的特定子类型类之一。

共有1个答案

申屠宏胜
2023-03-14

您不必继续创建方法(尽管您可能想要创建方法,这取决于创建GraphView的复杂程度),但是When中的案例数量将会增加。

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

使用具体化的类型在这里不会给你买任何东西。

 类似资料:
  • 问题内容: 有没有一种方法可以避免类型擦除并获得对类型参数的访问? 我需要了解并使用它来做事。是否可以,如果可以,如何在 不 将类传入构造函数或参数之外的任何地方的 情况下 完成操作? 编辑: 这个问题的主要目的是找出是否有 任何实用的方法 来消除类型擦除。 问题答案: 实际上, 没有 类型擦除的实用方法,因为您不能要求运行时无法访问的内容。当然,假设您同意为实现接口的每个枚举子类化通用类是一个实

  • 编译程序突出显示“companion”,表示“修饰符companion不适用于内部类”,还突出显示InnerClass()调用,表示“表达式无法从嵌套类工厂访问”,使用“inner”关键字使类处于内部。 我如何用Java中的静态工厂方法来实现我在这里试图做的事情?

  • 问题内容: 我有子过程命令将md5校验和检查为 它工作正常。但是我读了尽量避免 但是当我跑步 我得到错误 我可以运行以上命令或解决方法还是可以保留? 问题答案: 只需将参数传递为 列表即可 : 从文档: args 是所有调用所必需的,并且应为字符串或程序参数序列。通常最好提供一个参数序列,因为它允许模块处理任何必需的参数转义和引用(例如,允许在文件名中保留空格)。如果传递单个字符串,则必须是 sh

  • 这是: 因此,其思想是函数返回的一个实例,然后可以将该实例传递给函数。 工厂看起来是这样的(不编译): 非常感谢任何帮助。

  • 问题内容: 我正在尝试实现我的第一个工厂设计模式,但不确定将工厂制造的对象添加到列表时如何避免使用instanceof。这就是我想要做的: 根据我在SO上阅读的内容,使用“ instanceof”是一种代码味道。有没有一种更好的方法可以检查工厂创建的不使用“ instanceof”的车辆类型? 我欢迎任何有关实施的反馈/建议,因为我什至不确定我是否会采用正确的方法。 完整示例如下: 问题答案: 您

  • 问题内容: 我有这样的代码: 为什么我不能在第(5)行中打电话;在第(6)行中将为哪个类调用? 问题答案: 您不能这样做,因为子类的方法不在您的超类中。在这种情况下,尽管String是Object的子类,因为在java.lang.Object类中未声明length(),但无法在其实例上调用length。 但是equals()方法在字符串类中被覆盖,因此将调用Strings的equals()