不能从 SimpleScalar 强制类型转换为String(Object转换为String)

不能从 SimpleScalar 强制类型转换为String(Object转换为String)

今天在做Freemarker的时候发现一个错误的方法。SimpleScalar 强制类型转换为 String

大部分教程使用的方法是 (String)SimpleScalar   其实这是错误的


个对象转换为String有3种方式:

方法1:采用 Object.toString()方法
请看下面的例子:

SimpleScalar ss = new SimpleScalar()
System.out.println(ss.toString());
使用这种方法只需要保证当前对象不为空即可。

方法2:采用类型转换(String)object方法
这是标准的类型转换,将object转成String类型的值。使用这种方法时,需要注意的是类型必须能转成String类型。因此最好用instanceof做个类型检查,以判断是否可以转换。否则容易抛出异常。
String str= (String)100;

此外,因null值可以强制转换为任何java类类型,(String)null也是合法的。

方法3:采用String.valueOf(Object)
String.valueOf(Object)的基础是Object.toString()。但它与Object.toString()又有所不同。不同之处在于,无需担心是否为空,如果为空,就会返回字符串“null”,注意是字符串“null”


那么说说我今天遇到的问题:

首先是 接口TemplateMethodModel已经过时,目前的接口是TemplateMethodModelEx

请看如下完整demo代码

public class StringIndexOf implements TemplateMethodModelEx {

	@Override
	public Object exec(List arguments) throws TemplateModelException {
		if(arguments.size()!=2){
			throw new TemplateModelException("Wrong arguments");
		}
		/*
		 * class freemarker.template.SimpleScalar
		 * freemarker.template.SimpleScalar
		 * SimpleScalar
		 * somethingfoo
		 */
		String str1 = (String)arguments.get(1);
		String str2 = (String)arguments.get(0);
		System.out.println(str1+str2);
		return new SimpleNumber(str1.indexOf(str2));
	}
}

注意这两行代码

String str1 = (String)arguments.get(1);
String str2 = (String)arguments.get(0);

这两行代码表示获得的前台传递过来的两个参数,然后这样写是错误的

查询源码以及打印System.out.println(arguments.get(0).getClass());

我们知道,原来这个list里封装的是SimpleScalar对象,查询SimpleScalar对象,他是不能从SimpleScalar类型转换为String类型的

但是他却有重写的toString方法

因此以上代码正确的写法应该是:

String str1 = arguments.get(1).toString();
String str2 = arguments.get(0).toString();


爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情Blog Img