public class Main {
static class Animal { }
static class Dog extends Animal { }
static class Cat extends Animal { }
public <T extends Animal>T get(Class<T> type) {
// get the animals somehow
java.util.List<Animal> animals = getList();
for(Animal animal : animals) {
if(type.isInstance(animal)) {
// this casting is safe
return (T)animal;
}
}
// if not found
return null;
}
private java.util.List<Animal> getList() {
return java.
util.
Arrays.
asList(new Cat
(),
new Dog
()); }
public void test() {
Dog dog = get(Dog.class); // ok
Cat cat = get(Dog.class); // ok, expected compiler error
}
public static void main
(String[] args
) {
new Main().test();
}
}
cHVibGljIGNsYXNzIE1haW4gewogICAgCiAgICBzdGF0aWMgY2xhc3MgQW5pbWFsIHsgfQogICAgc3RhdGljIGNsYXNzIERvZyBleHRlbmRzIEFuaW1hbCB7IH0KICAgIHN0YXRpYyBjbGFzcyBDYXQgZXh0ZW5kcyBBbmltYWwgeyB9CiAgICAKICAgIHB1YmxpYyA8VCBleHRlbmRzIEFuaW1hbD5UIGdldChDbGFzczxUPiB0eXBlKSB7CiAgICAvLyBnZXQgdGhlIGFuaW1hbHMgc29tZWhvdwogICAgamF2YS51dGlsLkxpc3Q8QW5pbWFsPiBhbmltYWxzID0gZ2V0TGlzdCgpOwogICAgICAgIGZvcihBbmltYWwgYW5pbWFsIDogYW5pbWFscykgewogICAgICAgICAgICBpZih0eXBlLmlzSW5zdGFuY2UoYW5pbWFsKSkgewogICAgICAgICAgICAgICAgLy8gdGhpcyBjYXN0aW5nIGlzIHNhZmUKICAgICAgICAgICAgICAgIHJldHVybiAoVClhbmltYWw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gaWYgbm90IGZvdW5kCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAKICAgIHByaXZhdGUgamF2YS51dGlsLkxpc3Q8QW5pbWFsPiBnZXRMaXN0KCkgewogICAgICAgIHJldHVybiBqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdChuZXcgQ2F0KCksIG5ldyBEb2coKSk7CiAgICB9CiAgICAKICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB7CiAgICAgICAgRG9nIGRvZyA9IGdldChEb2cuY2xhc3MpOyAvLyBvawogICAgICAgIENhdCBjYXQgPSBnZXQoRG9nLmNsYXNzKTsgLy8gb2ssIGV4cGVjdGVkIGNvbXBpbGVyIGVycm9yCiAgICB9CiAgICAKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICAKICAgICAgICBuZXcgTWFpbigpLnRlc3QoKTsKICAgICAgICAKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRvbmUiKTsKICAgIH0KfQ==
Main.java:26: incompatible types
found : Main.Dog
required: Main.Cat
Cat cat = get(Dog.class); // ok, expected compiler error
^
Note: Main.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error