通配符
上一篇博客主要说明了泛型的几种类型,而今天要说的通配符和泛型是息息相关的
在追加了泛型的定以后,我们解决了“两个没有关系的对象进行强转出现的异常”,但是又产生了新的情况:参数统一问题
class Message<T> {
private T message;
public T getMessage() {
return message;
}
public void setMessage(T message) {
this.message = message;
}
}
public class Test{
public static void main(String[] args) {
Message<Integer> message = new Message();
message.setMessage(99);
fun(message);//出现错误,只能接收String
}
public static void fun(Message<String> temp){
System.out.println(temp.getMessage());
}
}
如上面代码,就出现了问题,泛型的类型设置的是Integer,而不是String
但是参数却是int型
-
所以我们需要解决其问题:可以接收所有的泛型类型,但是又不能让用户随意修改;这种情况就需要使用通配符 ? 来处理
-
可以接收任意类型
-
只能取得类中数据,不能修改数据
public class Test{
public static void main(String[] args) {
Message<Integer> message = new Message();
message.setMessage(99);
fun(message);//出现错误,只能接收String
}
//此时使用通配符“?”描述的是它可以接收任意类型
//但是由于不确定类型,所以无法修改
public static void fun(Message<?> temp){
//temp.setMessage(100);//无法修改
System.out.println(temp.getMessage());
}
}
- ? extends 类 :设置泛型上限
- 例如:
? extends Number
,表示只能设置Number或其子类,例如:Integer,Double等
class Message<T extends Number> {//设置泛型上限
private T message;
public T getMessage() {
return message;
}
public void setMessage(T message) {
this.message = message;
}
}
public class Test{
public static void main(String[] args) {
Message<Integer> message = new Message();
message.setMessage(99);
fun(message);//出现错误,只能接收String
}
//此时使用通配符“?”描述的是它可以接收任意类型
//但是由于不确定类型,所以无法修改
public static void fun(Message<? extends Number> temp){
//temp.setMessage(100);//仍然无法修改
System.out.println(temp.getMessage());
}
}
用在类上: T extends 类:T必须为类或者类的子类
用在方法上: ? extends 类:只能接收类或者其子类的泛型类
只能取得类中属性值,不能修改值(发生父类到子类的向下转型。需要强转,由于具体子类不确定,因此无法转型)
- ? super 类 :设置泛型下限
- 例如:
? super 类
,表示只能够设置String及其父类Object
class Message<T> {
private T message;
public T getMessage() {
return message;
}
public void setMessage(T message) {
this.message = message;
}
}
public class Test{
public static void main(String[] args) {
Message<String> message = new Message();
message.setMessage("hello world");
fun(message);
}
//此时使用通配符“?”描述的是它可以接收任意类型
//但是由于不确定类型,所以无法修改
public static void fun(Message<? extends Number> temp){
temp.setMessage("wonderful");//此时可以修改
System.out.println(temp.getMessage());
}
}
可以设置属性值(子类到父类是自动的向上转型)
- 上限可以用在声明,不能修改;而下限只能用在方法参数,可以修改内容