我来自c#世界。
在C#中我可以使用动态类http://msdn.microsoft.com/en-us/library/dd264741.aspx
这使我不必使用模板化/泛型类,但可以为certian情况实现类似的感觉。
我在互联网搜索方面一直没有成功,因为不幸的是“动态”和“java”关键字在动态架构上出现了很多不相关的信息。
我在javaFX中涉及了一点,并且有一个类型var似乎与c#的动态具有相同的用法。但它似乎不适用于Java。
感谢, 斯蒂芬妮
答案 0 :(得分:14)
Java不支持动态类型,但您可以使用Java中的动态代理模拟类似的东西。首先,您需要声明一个接口,其中包含您要在对象上调用的操作:
public interface MyOps {
void foo();
void boo();
}
然后在myObjectInstance上创建用于动态调用的代理:
MyOps p = (MyOps) Proxy.newProxyInstance(getClass().getClassLoader(), //
new Class<?>[] { MyOps.class }, //
new MyHandler(myObject));
p.foo();
p.boo();
MyHandler的声明如下:
public class MyHandler implements InvocationHandler {
private final Object o;
public MyHandler(Object o) {
this.o = o;
}
public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
Method method = o.getClass().getMethod(m.getName(), m.getParameterTypes());
return method.invoke(o, args);
}
}
所以,如果myObject有方法foo()和boo(),它们将被调用,否则你将得到一个RuntimeException。
还可以在JVM中支持动态类型运行的语言数量,例如Scala,Groovy,JRuby,BeanShell,JavaScript / Rhino等等。 Java 7中存在一些JVM更改以支持本机动态分派,因此这些语言可以更好地执行,但这种功能不会直接暴露在静态类型的Java语言中。
答案 1 :(得分:4)
Java中没有类似的东西
答案 2 :(得分:3)
Java中没有任何等价物。你可以做的最接近的事情是声明一个Object类型的变量,但是你必须将该变量强制转换为你期望的任何变量,以便调用它上面没有被Object实现的任何方法(或者使用反射,但是这是sloooow)。 / p>
Java是一种强类型语言。我认为在下一个版本中会有一些动态类型,允许关闭,但明年或更多可能是2012年。
在Groovy中,你可以使用“def”声明一个没有类型的变量,并且类型将在运行时解析。您可以将Groovy代码编译为Java字节码...
答案 3 :(得分:0)
您还可以包含Scala代码,该代码不需要显式类型声明。 Scala生成Java字节代码。我没有使用C#,所以我担心我不能把这个评论直接回答这个问题。也许其他人可以添加它。