在CompileTime限制对象类型的路径

时间:2017-04-19 17:41:42

标签: java scala types

我们已经说过了:

interface Container

package com.one
class ContainerImplOne extends Container

package com.two
class ContainerImplTwo extends Container

我们有许多实现从Container继承但位于不同的包中。如果我们有一个带有类型Container的函数:

def compute(c: Container): Unit

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

1 个答案:

答案 0 :(得分: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中扩展类的类。

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