如何用java表示python的typing.any?

fruv7luv  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(342)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

上个月关门了。
改进这个问题
我正在从事一个java项目,我想用java解析一些python代码。
python代码包含python中typing模块中的一些类型。基于某些类型,我需要运行特定的方法,因此如何表示java中不存在的python类型。这种类型的一个例子是 typing.Any .
为了 typing.Any 它等同于使用java泛型吗?我是否只需要浏览特定python类型的源代码,然后在java中重新实现它,或者有其他方法可以做到这一点?
据我所知 typing.Any python中的类只是禁用了任何类型检查,我不知道如何在java中这样做。目前我正在使用java对象,但我知道该对象不是任何对象的正确表示。
非常感谢您的帮助。

eimct9ow

eimct9ow1#

禁用任何类型检查,我不知道如何在java中这样做。
在java语言中,你不能这么做。java不允许您选择退出类型安全性。
对于typing.any,它等同于使用java泛型吗?
不。
还有别的办法吗? Object 包括你需要的一切。

Object o = (whatever python gave you);

当然,因为java是强类型的,所以不能只调用 o 然后让编译器运行:好吧,呃,好吧,我想如果我们运气好,并且这个方法在运行时正好在那里,我会调用它,如果没有,呃。。我想我会抛出一个例外。
java不是这样工作的。要让java像那样工作,你什么都做不了。所有的java都可以让你用你的 o 引用是保证对任何和所有对象都有效的东西(这并不多)!
您可以使用反射,但请注意,方法名称是不够的,除非只有一个方法具有该名称(在java中,可以有具有相同名称的不同方法,只要它们的param类型不同)。这极为笨拙,但也有可能:

Object o = (get from python);
String methodName = "sayHello";
Method m = findMethodWithName(o, methodName);
Object[] args = new Object[] {"Joe"};
m.invoke(o, args);

使用:

Method findMethodWithName(Object o, String name) {
  Method candidate = null;
  for (Method m : o.getClass().getMethods()) {
    if (!m.getName().equals(name)) continue;
    if (candidate != null) {
      throw new NoSuchMethodException("more than one " + name + " in " + o.getClass());
    }
    candidate = m;
  }
  if (candidate == null) throw new NoSuchMethodException("no public " + name + " in " + o.getClass());
  return candidate;
}

当然,这是慢狗。如果你喜欢这类东西,java不是你想要的。也许很棒。

相关问题