如果在Java中使用相同类名的2个类,(naming conflicts)至少有一个类必须使用全名(完全限定名,fully qualified name),包括包名和类名以避免命名冲突,例如java.util.Date和java.sql.Date。而Groovy中您可使用as关键字,它能在首次引入类时给该类起别名,如清单4.6所示。
清单4.6 Groovy类型别名
import java.sql.Date as SQLDate
def date = new Date()
def sqlDate = new SQLDate(date.time)
assert date == sqlDate
别名机制另一个有趣的功能就是改变其他类库的类的行为(behavior)。您可编写一个子类,它继承于其他类库的某个类,并且重载其中的某个方法。然而,当引入超类时,子类给该父类另起别名,而子类名却与父类相同,伪装成父类,但行为不同。如果已有代码使用该父类,这样,代码不需任何修改的情况下就能使用新的子类。下面的例子可以很好的解释这个问题。
假设您有第三方类库的HelloWorld类,并且不能访问其源代码。该类输出英文版的Hello World,见清单4.7。
清单4.7 原版本HelloWorld类
package library
public class HelloWorld{
public String sayHello(){
return 'Hello World'
}
}
调用清单4.7的HelloWorld类的示例代码大致如下:
import library.HelloWorld
HelloWorld helloWorld = new HelloWorld()
assert helloWorld.sayHello() == 'Hello World'
现在,假设您想改变该类的行为,使其输入西班牙文版的Hello World(Hola Mundo),并且不能修改原版本类或代码。清单4.8演示了如何通过使用as关键来实现。
清单4.8 使用Groovy别名机制后的HelloWorld类
import library.HelloWorld as HelloWorldEnglish
class HelloWorld extends HelloWorldEnglish {
public String sayHello(){
return 'Hola Mundo'
}
}
HelloWorld helloWorld = new HelloWorld()
assert helloWorld.sayHello() == 'Hola Mundo'