我有一个带有泛型类型参数的非常简单的接口。public interface Foo<T> { void add(T element);}现在,我在这样的类中有一个这个接口的变量:public class Bar { private Foo<?> foo; public void action() { Object o = new Object(); (Foo<Object> foo).add(o); // in my case i know that this will work }}但是现在,如果我修改接口使得类型参数必须扩展Comparable<T>,我怎样才能达到和上面一样的效果?public interface Foo<T extends Comparable<T>> { void add(T element);}public class Bar { private Foo<?> foo; public void action() { Object o = new Object(); // compiler error, since Object does not extent Comparable (Foo<Object> foo).add(o); }}更新:我有很多类实现了这个接口,例如:public class IntFoo implements Foo<Integer> { public void add(Integer element) { // do something }}在我的Bar班级中,我有一个Foo<?>,我想使用add(). 我已采取预防措施(例如使用instanceof),仅Integer在类型为 时添加Foo<Integer>。
1 回答
PIPIONE
TA贡献1829条经验 获得超9个赞
要了解为什么您的方法没有按照您期望的方式工作,您必须首先了解您使用的通配符 - ?,以及泛型与强制转换的一些背景知识。
带有通配符的泛型被视为“不关心”或“未知”类型;也就是说,您既不知道也不关心泛型中的类型,因为由于类型擦除,您以后无法检索它。
引入泛型是为了让我们免于麻烦或需要转换为我们想要的特定类型。我们可以定义一个同构类型并简单地处理它,而不是每次都必须强制转换。泛型允许我们在编译时处理由于错误类型转换而导致的不匹配类型,这意味着如果 Java 认为它是错误类型转换,代码甚至不会编译。
由于强制转换是开发人员从编译器中篡夺控制权的唯一方式,因此,如果您进行强制转换,则是在告诉编译器您知道自己在做什么。如果你不这样做,你会得到一个运行时异常。
说了这么多...
您将任何类型元素放入的唯一方法是,如果您有一个类型化和绑定的泛型。ComparableBar
public class Bar<T extends Comparable<T>> implements Foo<T> {
private Foo<T> foo;
public void add(T object) {
foo.add(object);
}
}
添加回答
举报
0/150
提交
取消