如何在Java中创建动态变量?

7
例如,在Haxe中,我可以创建严格类型的变量:var a:Float = 1.1;var b:String = "hello",如果需要也可以是动态的: var d:Dynamic = true; d = 22; d = "hi"; 那么在Java中如何创建这种类型的变量呢?

1
“Object” 我想这就是你要找的。 - Anand Undavia
3个回答

12
您可以使用 Object
Object d = true; 
d = 22; 
d = "hi";

你可以使用 instanceof 运算符来检查变量 d 存储的数据类型

Object d = true; 
System.out.println(d instanceof Boolean); // true
d = 22; 
d = "hi";       
System.out.println(d instanceof Integer); // false
System.out.println(d instanceof String);  // true

类型比较运算符instanceof


2
使用 instanceof 是一种代码异味,通常来自于有缺陷的类型分析,并且往往会创建混乱、充满错误的代码,除非你知道自己在做什么。 - Lew Bloch
@Lew,您是100%正确的。但是发布的答案重复了问题。 - Alex Byrth
2
我期望动态变量在运行时解析使用,就像C#的dynamic一样。也就是说,d.foo()会在运行时检查d是否有一个foo方法。 - chris
1
运行时类型和动态类型是有区别的。这里描述的“对象”策略解决了更多问题。你可以使用泛型和运行时类型标记来做必要的事情,而不会牺牲类型定向。这不是一个好答案;事实上恰恰相反。 - Lew Bloch

2
你可以考虑使用运行于JVM上的Groovy语言进行混合编程。它具有类型推断能力。

Java具有类型推断。类型推断不是动态类型。类型推断是强类型的一种策略。 - Lew Bloch

1

动态类型是有害的,因此Java避免使用它。像Swift和C#一样,Java是强类型的,这导致了更安全、更清洁的代码。所以放弃你的叛逆方式,拥抱面向类型编程的力量。你会因此变得更好。


3
C#有dynamic关键字来实现动态类型。它在一些特定场景下非常有用,比如处理JSON和与COM进行交互。 - chris
Java很好地处理了JSON的运行时类型。你根本不需要动态类型,@chris - Lew Bloch
@shal,请描述一个需要动态类型的“特殊”情况,我将向您展示如何使用强类型Java解决它。 - Lew Bloch
真理经过岁月的洗礼依然不变。 - Lew Bloch
1
我使用自动生成的JSON解析器,将各种JSON定义别名为单个类型。C#的dynamic非常美妙地允许我在本地绕过类型系统来处理它。还有其他解决方案,但它们都更丑陋和hackier。我想知道如果我在Java中如何解决这个问题,找到了这个答案...现在我很高兴我在用C#做这件事。有趣的是限制可以被称赞为特性。这不会帮助Java改进。 - hmijail
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接