我需要在客户端代码中使用泛型类及其类型参数。
public class Usable {
...
}
public interface User<T extends Usable> {
public void use(T usable);
}
//client
public class UserDemo {
public void demo() {
Usable usable = getUsable(); //returns Usable
User<? extends Usable> user = getUser(); //returns User<? extends Usable>
user.use(usable); //compilation error.
}
public Usable getUsable() {
....
}
public User<? extends Usable> getUser() {
....
}
}
编译错误是期望的类型是<? extends Usable>
,但传递的类型是Usable
。我该如何解决这个问题?约束是:
UserDemo
)只能在User
和Usable
(不是他们的子类型)上运行。 Usable
的子类型的对象。答案 0 :(得分:3)
这不起作用:
user.use(usable);
期望User<T extends Usable>
的T,Usable
或Usable
usable
是Usable
getUser()
返回? extends Usable
所以你可以想象一个场景:
getUser
返回SubUsable
,Usable
user.use()
期望SubUsable
并且无法接受您尝试通过的可用如果您更改getUser
的签名以返回Usable
,则会有效:
public void demo() {
Usable usable = getUsable();
User<Usable> user = getUser();
user.use(usable);
}
public Usable getUsable() { return null; }
public User<Usable> getUser() { return null; }