我很难理解这段代码。 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);
}
}
答案 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()方法。如果参数确实是预期类型,则程序运行,如果它是另一种类型,则它不适合并抛出。
泛型是一种帮助编译器检测类型安全性的技术。如果它无法确定类型安全性,它会给您一个警告。你应该真正服从并解决这样的编译器警告,否则使用泛型是没用的。