`
qiezi
  • 浏览: 491773 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

动静结合的语言?

阅读更多
静态类型和动态类型各有长短,为何不让这2者兼得呢?

比如一段代码:
String str = "Hello, World";
dynamic str1 = str.substring(7);
dynamic str2 = str1.toLowerCase();
dynamic str3 = str2.toUpperCase();

只需要一个关键字表明它是一个动态类型,并给它加上一个wrapper类,然后把方法调用扩展成一个send方法,我假想的编译器展开后结果是这样的:
String str = "Hello, World";
Dynamic str1 = new Dynamic(str.substring(7);
Dynamic str2 = new Dynamic(str1.send("toLowerCase"));
Dynamic str3 = new Dynamic(str2.send("toUpperCase"));

剩下的工作好办了,只要支持反射的语言都可以完成。

完整测试代码:
class Dynamic{
	private Object object;
	
	public Dynamic(Object object){
		this.object = object;
	}
	
	public Object send(String methodName, Object ... args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
		Class[] classes = new Class[args.length];
		for(int i=0; i<args.length; ++i)
			classes[i] = args[i].getClass();
		Method method = object.getClass().getMethod(methodName, classes);
		return method.invoke(object, args);
	}
	
	public String toString(){
		return object.toString();
	}
}

public class Test {

	public static void main(String[] args) throws SecurityException, IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
		String str = "Hello, World!";
		Dynamic str1 = new Dynamic(str.substring(7));  // dynamic str1 = str.substring(7);
		System.out.println(str1);
		Dynamic str2 = new Dynamic(str1.send("toLowerCase"));  // dynamic str2 = str1.toLowerCase();
		System.out.println(str2);
		Dynamic str3 = new Dynamic(str2.send("toUpperCase"));  // dynamic str3 = str2.toUpperCase();
		System.out.println(str3);
	}
}
分享到:
评论
2 楼 qiezi 2007-01-07  
一种从来没在其它语言中看到过的用法,居然是没什么新意?当然这只是我的想法,发出来也没打算有人给我评个“新意票”。。:oops:

现在大部分静态语言都面临着无缝联接脚本语言的问题,看看C++,应用比较广泛的做法有COM、XPCOM,其它的比如嵌入式脚本。Java能好到哪去呢?即便是Java6的脚本引擎,也还是不能算平滑无缝联接。

语言都是朝简化代码的方向走的,ruby可以使用ERB来平滑地用自身来解析执行外部模板,java不正缺这个东西吗?我简单地用过 velocity, jsf,它和java已经没什么关系了,而ERB和ruby是一体的。
1 楼 taowen 2007-01-05  
兼顾了静态语言和动态语言的缺点……呵呵,太尖锐了。不过的确是没有什么新意啊。

相关推荐

Global site tag (gtag.js) - Google Analytics