[英]how do you use generics in java to do the equivalent of a cast on an object?
[英]How do you deal with “super” generics in java?
采用以下泛型示例
import java.util.List;
import java.util.ArrayList;
public class GenericsTest {
private List<Animal> myList;
public static void main(String args[]) {
new GenericsTest(new ArrayList<Animal>()).add(new Dog());
}
public GenericsTest(List<Animal> list) {
myList = list;
}
public void add(Animal a) {
myList.add(a);
}
public interface Animal {}
public static class Dog implements Animal {}
public static class Cat implements Animal {}
}
它工作正常。 但是如你所知,你不能用它构建它
new GenericsTest(new ArrayList<Dog>());
因为,如你所知,add(Animal)可以添加Cat
。 解决此问题的建议方法,即通配符也不起作用,因为是的,您可以更改List<? extends Animal>
每个List<Animal>
List<? extends Animal>
List<? extends Animal>
但它有同样的问题:您可以使用List<Cat>
创建GenericsTest
,然后添加Dog
s。
所以我的问题是:有没有一种方便的方法来编写这个类一次,然后将它用于所有可能的Animals
? 当然它应该直接解决上述问题。
如果我理解你要做什么,那么你需要将泛型类型放在类级别:
public class GenericsTest<T extends Animal>
{
private List<T> myList;
public static void main(String args[])
{
new GenericsTest<Dog>(new ArrayList<Dog>());
}
public GenericsTest(List<T> list)
{
myList = list;
}
public void add(T a)
{
myList.add(a);
}
}
您可能希望将整个类设为通用而不仅仅是参数:
import java.util.List;
import java.util.ArrayList;
public class GenericsTest<T extends Animal> {
private final List<T> myList;
public static void main(final String args[]) {
new GenericsTest<Animal>(new ArrayList<Animal>()).add(new Dog());
new GenericsTest<Dog>(new ArrayList<Dog>()).add(new Dog());
new GenericsTest<Cat>(new ArrayList<Cat>()).add(new Cat());
}
public GenericsTest(final List<T> list) {
myList = list;
}
public void add(final T a) {
myList.add(a);
}
}
// Can't nest as Animal needs to be in scope of class declaration
interface Animal {}
class Dog implements Animal {}
class Cat implements Animal {}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.