import java.util.*;
class Ideone
{
{
List<Dog> dogs = new ArrayList<>();
dogs.add(new Dog());
dogs.add(new Dog());
// fun(dogs); // not allowed
List<Animal> animals = new ArrayList<>();
animals.add(new Animal());
animals.add(new Animal());
fun(animals);
fun2(dogs);
fun2(animals);
fun3(animals);
fun3(dogs);
}
static void fun(List<Animal> animals){
for(Animal a : animals){
a.eat();
}
}
static void fun2(List<?> values){ // can only be read
System.
out.
println(obj.
getClass()); }
// values.add(new Animal()); // not allowed to modify in wildcard generics
}
static void fun3(List<? extends Animal> values){ // wildcards with upper bound
for(Animal a : values){
a.eat();
}
}
}
class Animal {
void eat(){
System.
out.
println("Animal eats"); }
}
class Dog extends Animal {
void eat(){
System.
out.
println("Dog eats"); }
void bark(){
System.
out.
println("Dogs can bark"); }
}
aW1wb3J0IGphdmEudXRpbC4qOwpjbGFzcyBJZGVvbmUKewoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCgl7CgkJTGlzdDxEb2c+IGRvZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKCQlkb2dzLmFkZChuZXcgRG9nKCkpOwoJCWRvZ3MuYWRkKG5ldyBEb2coKSk7CgkJCgkJLy8gZnVuKGRvZ3MpOyAvLyBub3QgYWxsb3dlZAoJCQoJCUxpc3Q8QW5pbWFsPiBhbmltYWxzID0gbmV3IEFycmF5TGlzdDw+KCk7CgkJYW5pbWFscy5hZGQobmV3IEFuaW1hbCgpKTsKCQlhbmltYWxzLmFkZChuZXcgQW5pbWFsKCkpOwoJCQoJCWZ1bihhbmltYWxzKTsKCQkKCQlmdW4yKGRvZ3MpOwoJCWZ1bjIoYW5pbWFscyk7CgkJCgkJZnVuMyhhbmltYWxzKTsKCQlmdW4zKGRvZ3MpOwoJfQoJCglzdGF0aWMgdm9pZCBmdW4oTGlzdDxBbmltYWw+IGFuaW1hbHMpewoJCWZvcihBbmltYWwgYSA6IGFuaW1hbHMpewoJCQlhLmVhdCgpOwoJCX0KCX0KCQoJc3RhdGljIHZvaWQgZnVuMihMaXN0PD8+IHZhbHVlcyl7IC8vIGNhbiBvbmx5IGJlIHJlYWQKCQlmb3IoT2JqZWN0IG9iaiA6IHZhbHVlcyl7CgkJCVN5c3RlbS5vdXQucHJpbnRsbihvYmouZ2V0Q2xhc3MoKSk7CgkJfQoJCQoJCS8vIHZhbHVlcy5hZGQobmV3IEFuaW1hbCgpKTsgLy8gbm90IGFsbG93ZWQgdG8gbW9kaWZ5IGluIHdpbGRjYXJkIGdlbmVyaWNzCgl9CgkKCXN0YXRpYyB2b2lkIGZ1bjMoTGlzdDw/IGV4dGVuZHMgQW5pbWFsPiB2YWx1ZXMpeyAvLyB3aWxkY2FyZHMgd2l0aCB1cHBlciBib3VuZAoJCWZvcihBbmltYWwgYSA6IHZhbHVlcyl7CgkJCWEuZWF0KCk7CgkJfQoJfQp9CgpjbGFzcyBBbmltYWwgewoJdm9pZCBlYXQoKXsKCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFuaW1hbCBlYXRzIik7Cgl9Cn0KIApjbGFzcyBEb2cgZXh0ZW5kcyBBbmltYWwgewoJdm9pZCBlYXQoKXsKCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRvZyBlYXRzIik7Cgl9Cgl2b2lkIGJhcmsoKXsKCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRvZ3MgY2FuIGJhcmsiKTsKCX0KfQ==