IOC/JDBC/DAO - 此代码示例如何工作?
Posted
技术标签:
【中文标题】IOC/JDBC/DAO - 此代码示例如何工作?【英文标题】:IOC/JDBC/DAO - How does this code example work? 【发布时间】:2017-03-06 12:36:29 【问题描述】:我很难理解这段代码。 Phone13 是 SamSung 和 HTC 类的父接口。 VO 是 SamSungVO 和 HTCVO 的父类。 现在,我为我的界面 myPhone13 创建了一个三星实例。然后,我创建了一个 SamSungVO 实例。我也将它投射到 VO 并放入 myPhone.info(myVO) 方法。
我无法理解,虽然 myPhone.info(VO myVO) 以 VO 作为参数,但我已经用 SamSung 类实现了 myPhone 接口。所以看起来我将一个 VO 对象放入一个打算以三星对象作为其参数的方法中。我开始怀疑。这个实例如何自动从 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);
【问题讨论】:
【参考方案1】:您的 myPhone 变量未键入。编译器在该行给你一个警告
Phone13 myPhone = null
“Phone13 是原始类型。对泛型类型 Phone13 的引用应该被参数化”。
还有一条警告:
myPhone.info(myVO)
“方法info(VO)属于原始类型Phone13。对泛型Phone13的引用应该参数化”。
如果您使用 HTC 类型实例化 myVO,编译器会给出相同的警告,但在运行时会出现 ClassCastException。
myVO = new HTCVO()
myPhone.info(myVO)
由于您在每种情况下都将 myVO 实例化为 SamSungVO,因此将调用 SamSungVO 派生的 info() 方法。如果参数确实是预期的类型,则程序运行,如果是其他类型,则不适合并抛出。
泛型是一种帮助编译器检测类型安全的技术。如果它不能确定类型安全,它会给你一个警告。你真的应该遵守并解决这样的编译器警告,否则使用泛型是没有用的。
【讨论】:
以上是关于IOC/JDBC/DAO - 此代码示例如何工作?的主要内容,如果未能解决你的问题,请参考以下文章
navigationController 如何在此代码中设置它的 topViewController(来自 CoreDataBooks 示例)?