不能从 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/天,具体规则查看活动详情