如果在使用时泛型类时不传入泛型实参会出现警告,但是如果我们并不能确定其类型如何处理?第一种想法是传入Object类型的实参,但是实际上这种办法是行不通的。
public class Test {
public void listTest(List<Object> c){
for(int i=0;i<c.size();i++){
System.out.println(c.get(i));
}
}
public static void main(String[] args) {
List<String> strList=new ArrayList<>();
//编译不能通过,The method testList(List<String>) is undefined for the type Test
//testList(strList);
}
}这是因为Java中List<string>并不是List<object>的子类,指定类型为Object传入参数类型只能是Object。</object></string>
为了解决这个需求,可以使用类型通配符。
public void listTest(List<?> c){
for(int i=0;i<c.size();i++){
System.out.println(c.get(i));
}
}List<?>表明他是任何泛型List的父类,现在任何的List类型都可以调用listTest()方法。上面的代码解决了不指定类型抛出警告的问题,在有的时候却会使代码臃肿:使用了泛型还要进行强制类型转换。我们也可以设定通配符上限,只代表某一类泛型的父类。
public abstract class shape {
public abstract void draw(Canvas c);
}
public class Circle extends Shape {
@Override
public void draw(Canvas c) {
System.out.println("在画布" + c + "上画个圈圈");
}
}
public class Retangle extends Shape {
@Override
public void draw(Canvas c) {
System.out.println("在画布" + c + "上画个块块");
}
}
public class Canvas {
public void drawAll(List<? extends Shape> shapes) {
for (Shape s : shapes) {
s.draw(this);
}
}
}在并不知道受限制的通配符的具体类型时,不可以将Shape及其子类对象加入这个泛型集合中。
public void addRetangle(List<? extends Shape> shapes){
// shapes.add(0, new Retangle());
}
京公网安备 11010502036488号