IOC / JDBC / DAO - 此代码示例如何工作?

时间:2016-10-24 16:41:44

标签: jdbc casting inversion-of-control dao

我很难理解这段代码。 Phone13是SamSung和HTC类的父接口。 VO是SamSungVO和HTCVO的父类。 现在,我为我的界面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);

    }
}

1 个答案:

答案 0 :(得分:0)

您的myPhone变量未输入。编译器会在

行给出警告
myPhone.info(myVO)

“Phone13是原始类型。对通用类型Phone13的引用应该参数化”。

另一个警告是:

myVO = new HTCVO()
myPhone.info(myVO)

“方法信息(VO)属于原始类型Phone13。对通用类型Phone13的引用应该参数化”。

如果使用HTC类型实例化myVO,编译器会给出相同的警告,但在运行时会出现ClassCastException。

colnames(A) <- c("ID", "gauge", "lat", "lon", "area", tools::file_path_sans_ext(B$V1))

由于在每种情况下都将myVO实例化为SamSungVO,因此调用了SamSungVO派生的info()方法。如果参数确实是预期类型,则程序运行,如果它是另一种类型,则它不适合并抛出。

泛型是一种帮助编译器检测类型安全性的技术。如果它无法确定类型安全性,它会给您一个警告。你应该真正服从并解决这样的编译器警告,否则使用泛型是没用的。