我可能不在这里,但是我对泛型的理解有些不同。
如果我错了,我要有人纠正我。
海事组织-
这是一个非常令人困惑的结构。 您具有无限引用的Shape子类,看起来像。
您的Shape接口的使用方式与HashMap相同,但是我从未见过HashMap可以完成您想做的事情,最终您必须让X成为Shape中的类。 否则你在做HashMap
如果您始终希望X成为接口的“ IS A”关系,则不会发生。 那不是泛型的用途。 泛型用于将方法应用于多个对象,并且接口不能是对象。 接口定义了客户端和类之间的契约。 您所能做的就是说您将接受任何实现Runnable的对象,因为使用Runnable接口方法需要全部或某些方法。 否则,如果您未指定并将其定义为,则您的类与客户端之间的合同可能会产生意外的行为,并导致错误的返回值或引发异常。
例如:
public interface Animal {
void eat();
void speak();
}
public interface Dog extends Animal {
void scratch();
void sniff();
}
public interface Cat extends Animal {
void sleep();
void stretch();
}
public GoldenRetriever implements Dog {
public GoldenRetriever() { }
void eat() {
System.out.println("I like my Kibbles!");
}
void speak() {
System.out.println("Rufff!");
}
void scratch() {
System.out.println("I hate this collar.");
}
void sniff() {
System.out.println("Ummmm?");
}
}
public Tiger implements Cat {
public Tiger() { }
void eat() {
System.out.println("This meat is tasty.");
}
void speak() {
System.out.println("Roar!");
}
void sleep() {
System.out.println("Yawn.");
}
void stretch() {
System.out.println("Mmmmmm.");
}
}
现在,如果您上过此类,您可以期望您可以始终调用“ speak()”和“ sniff()”
public class Kingdom {
public Kingdom(X dog) {
dog.toString();
dog.speak();
dog.sniff();
}
}
但是,如果执行此操作,则永远无法调用“ speak()”和“ sniff()”
public class Kingdom {
public Kingdom(X object) {
object.toString();
object.speak();
object.sniff();
}
}
结论:
泛型使您能够对各种对象(而不是接口)使用方法。 您最后进入通用类必须是一种对象。