泛型 通配符2

本文深入讲解Java泛型的使用,包括泛型指定错误导致的编译错误、使用问号作为通配符接受任意类型的泛型对象及其限制,以及如何设置泛型的上限和下限来实现更精细的类型控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.泛型制定的类型不一致,编译时报错

class Info<T>
{
    private T var ;
    public void setVar(T var){
        this.var = var ;
    }
    public T getVar(){
        return this.var ;
    }
    public String toString(){
        return this.var.toString() ;
    }
}
public class GenericsDemo01
{
    public static void main(String args[]){
        Info<String> i = new Info<String>() ;
        i.setVar("MLDN") ;
        fun(i) ;
    }
    public static void fun(Info<Object> temp){
        System.out.println("内容:" + temp) ;
    }
}

D:\test\genericsdemo02>javac GenericsDemo01.java
GenericsDemo01.java:19: 错误: 无法将类 GenericsDemo01中的方法 fun应用到给定类型;

                fun(i) ;
                ^
  需要: Info<Object>
  找到: Info<String>
  原因: 无法通过方法调用转换将实际参数Info<String>转换为Info<Object>
1 个错误


2.?号表示,可以接收任意类型的泛型对象

class Info<T>
{
    private T var ;
    public void setVar(T var){
        this.var = var ;
    }
    public T getVar(){
        return this.var ;
    }
    public String toString(){
        return this.var.toString() ;
    }
}
public class GenericsDemo01
{
    public static void main(String args[]){
        Info<String> i = new Info<String>() ;
        i.setVar("MLDN") ;
        fun(i) ;
    }
    public static void fun(Info<?> temp){
        System.out.println("内容:" + temp) ;
    }
}

使用?可以接收任意的内容,但是此内容却无法使用?修饰的泛型对象进行修改

3.受限泛型

设置上限:

声明对象:          类名称<?extends 类> 对象名称

声明类:              类名称<泛型标识 extends 类>{}

设置下限

声明对象:          类名称<?super 类> 对象名称

声明类:              类名称<泛型标识 extends 类>{}


设置上限:

class Info<T>
{
    private T var ;
    public void setVar(T var){
        this.var = var ;
    }
    public T getVar(){
        return this.var ;
    }
    public String toString(){
        return this.var.toString() ;
    }
}
public class GenericsDemo02
{
    public static void main(String args[]){
        Info<Integer> i1 = new Info<Integer>() ;
        Info<Float> i2 = new Info<Float>() ;
        i1.setVar(30) ;
        i2.setVar(30.2f) ;
        fun(i1) ;
        fun(i2) ;
    }

    public static void fun(Info<? extends Number> temp){
        System.out.println(temp + "、") ;
    }
}


设置下限:

class Info<T>
{
    private T var ;
    public void setVar(T var){
        this.var = var ;
    }
    public T getVar(){
        return this.var ;
    }
    public String toString(){
        return this.var.toString() ;
    }
}
public class GenericsDemo04
{
    public static void main(String args[]){
        Info<String> i1 = new Info<String>() ;
        Info<Object> i2 = new Info<Object>() ;
        i1.setVar("MLDN") ;
        i2.setVar(new Object()) ;
        fun(i1) ;
        fun(i2) ;
    }

    public static void fun(Info<? super String> temp){
        System.out.println(temp + "、") ;
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值