IOC/JDBC/DAO - 此代码示例如何工作?
IOC/JDBC/DAO - How does this code example work?
我很难理解这段代码。
Phone13 是 SamSung 和 HTC 类 的父界面。
VO 是 SamSungVO 和 HTCVO 的父 Class。
现在,我为我的接口 myPhone13 创建了一个 SamSung 实例。然后,我创建一个 SamSungVO 实例。我也将它投射到 VO 并放入
myPhone.info(myVO) 方法。
虽然myPhone.info(VO myVO)以VO为参数,但我用SamSung Class实现了myPhone接口,我无法理解。所以看起来我将一个 VO 对象放入一个方法中,该方法打算将 SamSung 对象作为其参数。我开始怀疑。此实例如何自动从 VO 传输到 SamSungVO?
我认为不允许将父对象作为以子实例为参数的方法的参数。
package others;
class VO{}
interface Phone13 <E extends VO>{
public void info(E myVO);
}
class SamSung implements Phone13<SamSungVO>{
@Override
public void info(SamSungVO myVO) {
System.out.println(myVO.name);
}
}
class SamSungVO extends VO{
String name = "SamSung";
}
class HTC implements Phone13<HTCVO>{
@Override
public void info(HTCVO myVO) {
System.out.println(myVO.name);
}
}
class HTCVO extends VO{
String name = "HTC";
}
public class MyIOC02 {
public static void main(String[] args) {
Phone13 myPhone = null;
// When I need to use SamSung
myPhone = new SamSung();
VO myVO = new SamSungVO();
myPhone.info(myVO);
}
}
您的 myPhone 变量未键入。编译器在
行给你一个警告
Phone13 myPhone = null
"Phone13 is a raw type. References to generic type Phone13 should be parameterized".
另一个警告在行:
myPhone.info(myVO)
"The method info(VO) belongs to the raw type Phone13. References to generic type Phone13 should be parameterized".
如果您使用 HTC 类型实例化 myVO,编译器会给出相同的警告,但在运行时会出现 ClassCastException。
myVO = new HTCVO()
myPhone.info(myVO)
由于您将 myVO 实例化为 SamSungVO,因此在每种情况下都会调用 SamSungVO 派生的 info() 方法。如果参数确实是预期的类型,则程序运行,如果是其他类型,则不适合并抛出。
泛型是一种帮助编译器检测类型安全的技术。如果它不能确定类型安全,它会给你一个警告。你真的应该遵守并解决这样的编译器警告,否则使用泛型是没有用的。
我很难理解这段代码。 Phone13 是 SamSung 和 HTC 类 的父界面。 VO 是 SamSungVO 和 HTCVO 的父 Class。 现在,我为我的接口 myPhone13 创建了一个 SamSung 实例。然后,我创建一个 SamSungVO 实例。我也将它投射到 VO 并放入 myPhone.info(myVO) 方法。
虽然myPhone.info(VO myVO)以VO为参数,但我用SamSung Class实现了myPhone接口,我无法理解。所以看起来我将一个 VO 对象放入一个方法中,该方法打算将 SamSung 对象作为其参数。我开始怀疑。此实例如何自动从 VO 传输到 SamSungVO?
我认为不允许将父对象作为以子实例为参数的方法的参数。
package others;
class VO{}
interface Phone13 <E extends VO>{
public void info(E myVO);
}
class SamSung implements Phone13<SamSungVO>{
@Override
public void info(SamSungVO myVO) {
System.out.println(myVO.name);
}
}
class SamSungVO extends VO{
String name = "SamSung";
}
class HTC implements Phone13<HTCVO>{
@Override
public void info(HTCVO myVO) {
System.out.println(myVO.name);
}
}
class HTCVO extends VO{
String name = "HTC";
}
public class MyIOC02 {
public static void main(String[] args) {
Phone13 myPhone = null;
// When I need to use SamSung
myPhone = new SamSung();
VO myVO = new SamSungVO();
myPhone.info(myVO);
}
}
您的 myPhone 变量未键入。编译器在
行给你一个警告Phone13 myPhone = null
"Phone13 is a raw type. References to generic type Phone13 should be parameterized".
另一个警告在行:
myPhone.info(myVO)
"The method info(VO) belongs to the raw type Phone13. References to generic type Phone13 should be parameterized".
如果您使用 HTC 类型实例化 myVO,编译器会给出相同的警告,但在运行时会出现 ClassCastException。
myVO = new HTCVO()
myPhone.info(myVO)
由于您将 myVO 实例化为 SamSungVO,因此在每种情况下都会调用 SamSungVO 派生的 info() 方法。如果参数确实是预期的类型,则程序运行,如果是其他类型,则不适合并抛出。
泛型是一种帮助编译器检测类型安全的技术。如果它不能确定类型安全,它会给你一个警告。你真的应该遵守并解决这样的编译器警告,否则使用泛型是没有用的。