Java泛型与继承之间存在一些冲突,主要体现在以下几个方面:
public class Parent<T> {
}
public class Child<T> extends Parent<T> {
}
? extends T 或 ? super T)时,不能直接使用继承关系。例如,以下代码是非法的:public void process(List<? extends Parent> list) {
for (Parent item : list) { // 编译错误
// ...
}
}
public <T extends Parent> void process(T item) {
// ...
}
public class Parent<T> {
public void doSomething(T item) {
// ...
}
}
public class Child extends Parent<String> {
// ...
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
child.doSomething(42); // 编译错误,因为编译器认为doSomething方法的参数类型应该是String
}
}
要解决这些冲突,可以采用以下方法:
public class Parent<T> {
}
public class Child<T> extends Parent<T> {
}
? extends T 或 ? super T。例如:public void process(List<? extends Parent> list) {
for (Object item : list) { // 使用Object类型,因为编译器无法确定具体的泛型类型
// ...
}
}
public <T extends Parent> void process(T item) {
// ...
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
((Parent) child).doSomething(42); // 使用类型转换,但可能导致运行时异常
}
}
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。