【问题标题】:Restrict Object Type's path at CompileTime在编译时限制对象类型路径
【发布时间】:2017-09-16 02:10:21
【问题描述】:

假设我们有以下内容:

interface Container

package com.one
class ContainerImplOne extends Container

package com.two
class ContainerImplTwo extends Container

我们有许多继承自 Container 但驻留在不同包中的实现。如果我们有一个接受容器类型的函数:

def compute(c: Container): Unit

我们不知道传入的对象是来自包 com.one 还是 com.two。有没有办法限制计算函数从包二中获取容器实例?换句话说,有没有办法将类型限制为来自 com.Two.*?我们可以在 Java 或 Scala 中做到这一点吗?

【问题讨论】:

  • @DavisBroda 不,这不是同一个问题。这里的意义不是具体类型的名称,而是它们继承自同一个接口,函数采用接口的类型。但是这两种实现都是在不同的包中定义的。我将 impl 更新为具有不同的名称。
  • 然后让它使用containerImplTwo,而不是container,你的问题就解决了。如果你只想要一个实现,那你为什么一开始就使用接口呢?
  • 不,有很多 Container 类型的实现,它可以来自任何一个包。
  • 如果是这种情况,请使用该信息更新问题。但是如果你可以编辑包二的源代码,我可能会有一个想法。
  • @DavisBroda 我们是第三方图书馆,所以我们不能。

标签: java scala types


【解决方案1】:

你可以(如果你真的,真的,真的需要;如果我曾经看到一个库这样做,除了可能解决com.one 中的已知错误,我会不惜一切代价避免它):

def compute(c: Container): Unit = {
  if (c.getClass.getPackage.getName == "com.two") {
    ...
  } else {
    // do nothing, or throw an exception, etc.
  }
}

您也可以修改它以支持扩展com.two 中的类。

这在运行时而不是在编译时失败,您可以创建一个在编译时失败的宏。

【讨论】:

  • 我们最终做到了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多