public <T> void show(T t),void前面的泛型T是什么作用

本文深入讲解Java泛型方法的使用,包括泛型方法的声明、返回值类型以及如何在实际编程中应用。通过示例代码解释了泛型方法与泛型类的区别,以及如何正确地在方法中使用泛型。

public <T>这个T是个修饰符的功能,表示是个泛型方法,就像有static修饰的方法是个静态方法一样。

<T> 不是返回值,表示传入参数有泛型

public static <T>list<T> aslist(T...a)  

第一个表示是泛型方法,第二个表示返回值是list类型,而这个list有泛型,只能存t类型的数据

泛型方法的使用示例:

 1 public <T> void fromArrayToCollection(T[] a, Collection<T> c){  
 2         for(T t : a){  
 3             c.add(t);  
 4         }  
 5     }  
 6   
 7   
 8 public void fromArrayToCollection(T[] a, Collection<T> c){  
 9         for(T t : a){  
10             c.add(t);  
11         }  
12     }  

第一个方法相当于为该方法声明了一个类型为T的类,这个方法放到任意一个类中都不会报错的。

第二个方法相当于没有声明类型为T的类,这时必须在类上面加上泛型T,不然这个方法会报错的。

 1 package generic;
 2 
 3 /**
 4  * 泛型方法测试
 5  * 
 6  * @author caiyu
 7  * 
 8  */
 9 public class GenMethod {
10 
11     public static <T> void display(T t) {
12         System.out.println(t.getClass());
13     }
14 }

首先,泛型的声明,必须在方法的修饰符(public,static,final,abstract等)之后,返回值声明之前。

然后,和泛型类一样,可以声明多个泛型,用逗号隔开

<think>我们正在讨论Java。用户询问的是Java中<T>的用法,并请求示例。根据引用内容,我们可以总结以下几点:1.本质是参数化类,可以用在类、接口和方法上(引用[3])。2.在方法上使用时,需要在访问修饰符和返回类之间加上<T>(引用[2])。3.方法可以与非方法共存,但要注意当两者都满足条件时,会优先执行非方法(引用[1])。4.引用[2]提供了一个方法的示例:在类中定义了一个方法getLastItem,可以接收任意类的数组并返回最后一个元素。因此,我们可以给用户讲解方法的基本语法,并通过示例说明。另外,注意引用[4]虽然提到的是C#的集合,但Java中也有类似List<T>和Set<T>的用法,不过用户当前问题集中在<T>的用法上,特别是方法上的使用。我们将重点放在方法的讲解上,并给出示例。回答结构:1.解释方法的基本语法。2.给出一个或多个示例。3.说明类推断和类参数的使用注意事项。同时,根据指令,我们需要生成相关问题。</think>### Java `<T>` 用法详解 是Java的类参数化机制,允许在类、接口或方法中定义类占位符`<T>`(T可替换为任意标识符),在实例化或调用时指定具体类,从而实现类安全的代码复用。 #### 一、核心用法示例 1. **类** 在类名后声明`<T>`,类内部可将`T`作为类使用: ```java public class Box<T> { private T content; public void set(T item) { this.content = item; } public T get() { return content; } } // 使用 Box<String> stringBox = new Box<>(); stringBox.set("Hello"); String value = stringBox.get(); // 无需强制类转换 ``` 2. **方法** 在返回值前声明`<T>`,方法内可使用类参数: ```java public <T> T getLastElement(T[] array) { return array[array.length - 1]; } // 调用时自动类推断 String[] strs = {"A", "B", "C"}; String last = getLastElement(strs); // T被推断为String ``` 3. **接口** 接口定义类参数,实现类可指定具体类: ```java public interface Processor<T> { void process(T input); } // 实现类指定String类 public class StringProcessor implements Processor<String> { @Override public void process(String input) { System.out.println(input.toUpperCase()); } } ``` #### 二、关键特性 1. **类安全** 编译器检查类匹配,避免运行时的`ClassCastException`: ```java List<Integer> intList = new ArrayList<>(); intList.add(10); // intList.add("abc"); // 编译错误 ``` 2. **类擦除** 仅在编译期存在,运行时会被擦除(替换为`Object`或边界类)。例如`Box<String>`在JVM中实际是`Box<Object>`[^3]。 3. **通配符与边界** - `<?>`:未知类(无界通配符) - `<? extends Number>`:上界通配符(接受Number及其子类) - `<? super Integer>`:下界通配符(接受Integer及其父类) #### 三、注意事项 1. **与重载** 当方法和非方法冲突时,优先调用非方法[^1]: ```java public void show(String s) {} // 非方法 public <T> void show(T a) {} // 方法 show("test"); // 调用非版本 ``` 2. **类推断** 编译器可通过上下文推断类参数,简化代码: ```java // Java 7+ 的菱形语法 List<String> list = new ArrayList<>(); ``` 3. **限制** 不可用基本类实例化(如`Box<int>`非法),需使用包装类。 > 参考示例:引用[2]展示了方法返回数组最后一个元素的实现[^2],引用[3]解释了参数化类的本质[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值