我一直在研究创建条形码扫描程序,在我的研究中,我遇到了一些我以前从未见过的东西,而且我不确定它到底在做什么......
这是我的程序片段,包括我不理解的行:
import javax.comm.*;
public class InvScan implements SerialPortEventListener {
static CommPortIdentifier portId1;
SerialPort serialPort1;
public InvScan(){
serialPort1 = (SerialPort) portId1.open("InvScan", 2000); //what does this mean?
}
请参阅我评论的行“这是什么意思?”。 SerialPort是一个抽象类......我知道抽象类可以使用匿名类进行实例化,但我以前从未见过它。这行代码来自一个程序的教程,该程序旨在做一些与我想做的事情相关的事情,但是作者没有很好地解释这里发生了什么(或者我可能只是不理解?)。他的笔记说:
我们通过执行portId1的open()方法来实例化SerialPort对象。 Recall portId1是一个ComPortIdentifier对象,open()方法来自ComPortIdentifier。
我已经做了一些研究,我甚至找不到另外一个例子来说明这里发生了什么(可能是因为我甚至不知道该怎么称呼它,真的)。
这对我的程序来说甚至都不是必不可少的,因为我可以重新设计它(而不是一个脚本小子,哈哈),但是我真的不知道我不知道该行是怎么回事。
答案 0 :(得分:1)
实际对象是从SerialPort
派生的非抽象子类的实例化。所有这一切都提供了保证抽象方法已在该实例化对象中完全定义。在内部,这看起来像:
public class CommPortIdentifier ... {
...
public CommPort open(java.lang.String appname, int timeout)
throws PortInUseException {
CommPort val = new NonAbstractCommPort( ... );
// Do something here
return val;
}
...
}
作为CommPort
的抽象子类,转换为SerialPort
的风险稍大,除非保证对象的实际返回类型是SerialPort
的子类。
答案 1 :(得分:0)
从portId1.open
返回的是SerialPort
的子类型。抽象类可能仍然具有具体的子类型;这段代码的作用是将返回的对象强制转换为已知的超类型。
答案 2 :(得分:0)
行portId1.open("InvScan", 2000)
调用一个返回SerialPort
的子类的方法。然后它被转换为SerialPort
。 (抽象类可以有非抽象的子类。)