我有一个非常简单的带有泛型类型参数的界面。
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
}
}
但是,现在,如果我修改接口以使type参数必须扩展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>
。
答案 0 :(得分:1)
要了解为什么您的方法无法按预期方式工作,必须首先了解所使用的通配符-?
,并具有泛型和强制转换的一些背景知识。
带有通配符的泛型被视为“无关”或"unknown" type;也就是说,您既不知道也不关心该泛型中的类型,因为由于类型擦除,您以后将无法检索它。
引入了泛型,以免我们麻烦或需要转换为我们想要的特定类型。我们可以定义同构类型,而只需处理那个,而不必每次都强制转换。泛型允许我们处理由于编译时错误转换而导致的类型不匹配的类型,这意味着如果Java认为它是错误类型转换,则代码甚至都不会编译。
由于强制类型转换是开发人员篡改编译器控件的唯一方法,因此如果强制类型转换,您将告诉编译器您知道自己在做什么。如果您不,您将获得运行时异常。
所有要说的...
如果您有类型化和绑定的泛型,则将<{>} 类型的任何Comparable
元素放入Bar
的方法。
public class Bar<T extends Comparable<T>> implements Foo<T> {
private Foo<T> foo;
public void add(T object) {
foo.add(object);
}
}