Java中的泛型介绍

1.泛型的定义

   泛型就是允许在定义类,接口时指定类型参数,这个类型参数将在声明变量、创建对象时确定,则不同类型的对象就不会添加到该泛型集合中。也不需进行强制类型转换。

2.泛型的好处

   在没有泛型之前,一旦把一个对象加入到Java容器(集合)中,集合就会忘记对象的类型,把所有的对象都当成Object类型处理,当程序从集合中取出对象后,就需要进行强制类型转换,而这种转换不仅代码臃肿,而且容易引起ClassCastException异常。

3.泛型类派生子类

   1)当创建了带泛型声明的接口、父类之后、可以为该接口创建实现类,或从该父类派生子类,但不能包含类型参数:

   正确方式如下:public class A extends B<String>,B为一泛型接口,或含有泛型参数的类。也可以不指定类型,如下

   public class A extends B;

   2)并未生成真正的泛型类

     如:ArrayLIst<String>和ArrayLIst<Integer>仍是相同的类,系统不会为其生成新的class文件。但不能使用instanceof运算符进行判断。如下:

Collection cs=new Arraylist<String>();
if(cs instanceof List<String>)//将会引起编译错误,instanceof运算符后不能使用泛型类
{}

4.当不确定泛型类的类型实参时,一般使用类型通配符?来代替,使用如下:

public void test(List<?> c)
{
      for(int i=0;i<c.size();i++)
     {
            System.out.println(c.get(i));
     }
}
但不能这样使用:

List<?> c=new ArrayList<String>();
c.add(new Object());
此时List<?>可以理解是任何泛型List的父类。如果我们只想表示某一类泛型List的父类,可使用如下方法:

public abstract class Sharp
{
    public abstract void draw(Canvas c);
}
public class Canvas
{
     public void drawall(List<? extends Sharp> sharps){}//该函数中的参数被限制为Sharp类的子类类型的参数
    
}

也可以在定义含有泛型参数的类时设定类型形参的上限,如下:

public class Apple<T extends Number>

5.泛型方法

   定义:在声明方法时定义一个或多个类型参数,如下:

   修饰符<T,S>返回值类型  方法名(形参列表){方法体}

   static  <T> void fun(T[] a,Collection<T> c)

<think>好的,我现在需要帮助用户了解Java的使用方法和示例。首先,用户提供的引用内容提到类、方法、静态方法以及伪的概念。我需要结合这些信息,整理出一个结构清晰的回答,并确保遵循系统级指令中的格式要求。 首先,用户可能对的基本概念不太清楚,所以需要先简单解释什么是,以及它的作用,比如类安全、代码复用等。然后,分点介绍的不同用法,比如类、方法接口,每个部分都要有示例代码,并且代码中的数学表达式要用$...$格式,比如在解释方法时,如果有涉及类参数T,可以用$T$来表示。 接下来,需要注意引用内容中提到的伪,说明Java在编译时类擦除的特性,这可能会影响运行时无法获取的具体类。此外,用户可能想知道如何使用通配符和边界,比如上界和下界通配符,这部分需要给出示例,并正确应用LaTeX格式,比如$? extends Number$。 用户还提到静态方法,需要特别注意静态方法不能使用类定义的,而必须自己声明,这点要强调,避免常见错误。示例代码需要正确展示如何在静态方法中定义类参数。 最后,生成相关问题时要考虑用户可能进一步想知道的内容,比如类擦除的影响、通配符的使用场景、与集合框架的结合,以及类边界的作用。确保每个问题都有针对性,帮助用户深入理解。 现在检查是否有遗漏,比如是否覆盖了所有引用中的要点,引用的标识是否正确添加,示例代码是否符合语法,数学表达式是否正确使用$符号。同时,确保回答结构清晰,分点明确,符合用户可见层的要求。</think>### Java使用方法及示例 Java用于实现**类参数化**,提高代码复用性和类安全性[^1]。以下是具体用法及示例: --- #### 一、类 定义类时声明类参数$T$,可在类中作为类使用: ```java public class Box<T> { private T content; public void setContent(T content) { this.content = content; } public T getContent() { return content; } } // 使用示例 Box<String> stringBox = new Box<>(); stringBox.setContent("Hello"); ``` --- #### 二、方法方法返回值前声明类参数$T$,可在非类中使用: ```java public class Utils { public static <T> T getMiddle(T[] arr) { return arr[arr.length/2]; } } // 调用示例 String[] names = {"Alice", "Bob", "Charlie"}; String middle = Utils.<String>getMiddle(names); // 返回"Bob" ``` --- #### 三、接口 定义接口时声明类参数,常用于集合类: ```java public interface List<T> { void add(T element); T get(int index); } // 实现示例 class StringList implements List<String> { // 必须使用String类实现方法 } ``` --- #### 四、类边界 限制范围: ```java public static <T extends Number> double sum(T a, T b) { return a.doubleValue() + b.doubleValue(); } // 只能传入Number及其子类 sum(10, 20.5); // 合法 sum("a", "b"); // 编译错误 ``` --- #### 五、通配符 处理未知类集合时使用: ```java // 上界通配符 void process(List<? extends Number> list) { /* 可读不可写 */ } // 下界通配符 void addNumbers(List<? super Integer> list) { /* 可写不可读 */ } ``` --- #### 关键特性 1. **类擦除**:编译后会被替换为Object或边界类[^3] 2. **静态方法限制**:静态方法需单独声明: ```java public static <T> void print(T item) { System.out.println(item); } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值