Java 泛型<T> T与T的用法

<T> T表示返回值是一个泛型,传递啥,就返回啥类型的数据,而单独的T就是表示限制你传递的参数类型,这个案例中,通过一个泛型的返回方式,获取每一个集合中的第一个数据, 通过返回值<T> T 和T的两种方法实现

<T> T 用法

这个<T> T 表示的是返回值T是泛型,T是一个占位符,用来告诉编译器,这个东西先给我留着,等我编译的时候,告诉你。

package com.yellowcong.test;

import java.util.ArrayList;
import java.util.List;

import org.apache.poi.ss.formula.functions.T;

public class Demo {

    public static void main(String[] args) {

        Demo demo = new Demo();

        //获取string类型
        List<String> array = new ArrayList<String>();
        array.add("test");
        array.add("doub");
        String str = demo.getListFisrt(array);
        System.out.println(str);

        //获取nums类型
        List<Integer> nums = new ArrayList<Integer>();
        nums.add(12);
        nums.add(13);

        Integer num = demo.getListFisrt(nums);
        System.out.println(num);
    }

    /**
     * 这个<T> T 可以传入任何类型的List
     * 参数T
     *     第一个 表示是泛型
     *     第二个 表示返回的是T类型的数据
     *     第三个 限制参数类型为T
     * @param data
     * @return
     */
    private <T> T getListFisrt(List<T> data) {
        if (data == null || data.size() == 0) {
            return null;
        }
        return data.get(0);
    }

}

T 用法

返回值,直接写T表示限制参数的类型,这种方法一般多用于共同操作一个类对象,然后获取里面的集合信息啥的。

package com.yellowcong.test;

import java.util.ArrayList;
import java.util.List;

public class Demo2<T> {

    public static void main(String[] args) {

        //限制T 为String 类型
        Demo2<String> demo = new Demo2<String>();

        //获取string类型
        List<String> array = new ArrayList<String>();
        array.add("test");
        array.add("doub");
        String str = demo.getListFisrt(array);
        System.out.println(str);

        //获取Integer类型 T 为Integer类型
        Demo2<Integer> demo2 = new Demo2<Integer>();
        List<Integer> nums = new ArrayList<Integer>();
        nums.add(12);
        nums.add(13);
        Integer num = demo2.getListFisrt(nums);
        System.out.println(num);
    }

    /**
     * 这个只能传递T类型的数据
     * 返回值 就是Demo<T> 实例化传递的对象类型
     * @param data
     * @return
     */
    private T getListFisrt(List<T> data) {
        if (data == null || data.size() == 0) {
            return null;
        }
        return data.get(0);
    }

如:

mQueryBtn = (Button) findViewById(R.id.query_btn);
mUpdateBtn = (Button) findViewById(R.id.update_btn);
mDeleteBtn = findViewByEx(R.id.delete_btn);
mImageView = findViewByEx(R.id.imageView);

@SuppressWarnings("unchecked")
public <T> T findViewByEx(int viewId) {
	return  (T) this.findViewById(viewId);
}

 

转自:https://www.cnblogs.com/jpfss/p/9929108.html 

<think>嗯,用户问的是关于Java中静态方法使用参数时,参数<T>是否可以在方法返回值之后声明,或者它们的顺序是否有要求。这个问题涉及到Java方法的语法规则,我需要仔细回忆一下相关的语法规范。 首先,我记得在Java中,方法的声明需要在方法返回类之前指定类参数。比如,public static <T> void method(T t) {...},这里的<T>是放在方法返回类void之前的。用户的问题是说,是否可以把<T>放在方法名之后,返回类之前的位置,或者有没有顺序上的要求。 我需要确认一下Java语法是否允许将类参数放在方法名之后。根据我的记忆,Java的语法规定,方法的类参数必须紧接在方法的修饰符(如public、static)之后,方法返回类之前。也就是说,格式应该是:修饰符 <类参数> 返回类 方法名(参数列表)。例如,public static <T> T method(T t) {...}。这里的<T>位于static之后,返回类T之前。 如果用户尝试将<T>放在方法名之后,比如public static T <T> method(T t),这样的写法是不符合Java语法的,编译器会报错。因为类参数列表必须出现在方法返回类之前,紧跟在修饰符后面。因此,顺序是有严格要求的,不能随意调换。 可能用户有这种疑问是因为在类声明中,参数是跟在类名后面的,比如public class MyClass<T> {...}。所以可能会联想到方法是否也可以将类参数放在方法名后面。但方法的语法规则不同,类参数必须放在方法返回类之前,而不是方法名之后。 另外,需要确认静态方法是否允许使用参数。答案是肯定的,静态方法可以有自己的参数,但这些参数必须是在方法级别声明的,而不是类级别的。因为类的参数在静态上下文中是不可用的,所以静态方法需要自己声明。 例如,正确的写法是: public static <T> T getInstance(Class<T> clazz) {...} 而错误的写法可能是: public static T getInstance(Class<T> clazz) {...} // 这里没有声明<T>,编译器会报错找不到T 或者,如果用户试图将<T>放在返回类后面: public static T <T> getInstance(Class<T> clazz) {...} // 语法错误,位置不对 所以总结来说,Java规定方法的类参数必须位于方法修饰符(如static)之后,返回类之前,顺序不可调换。用户必须按照这个语法规则来编写,否则会导致编译错误。</think>在Java中,静态方法声明参数时,参数的声明位置有严格语法要求。以下是逐步解释: 1. **基本语法规则** Java规定:参数的声明(如`<T>`)必须紧接在方法的**修饰符**(如`public static`)之后,**返回值类之前**。 格式为: ```java 修饰符 <参数> 返回值类 方法名(参数列表) ``` 2. **正确示例** ```java public static <T> T getFirst(List<T> list) { return list.get(0); } ``` - `<T>`位于修饰符`static`之后,返回值类`T`之前。 - 参数的作用域仅限本方法。 3. **错误示例** ```java public static T <T> getFirst(List<T> list) { // 编译错误 return list.get(0); } ``` - 参数`<T>`被错误地放在返回值类`T`之后,导致语法错误。 4. **为何顺序不可调换?** - **编译器解析顺序**:Java编译器需要先知道参数的存在,才能正确解析返回值类和方法参数中的符号(如`T`)。 - **作用域限定**:参数的声明位置决定了其作用域范围。若放在返回值之后,会导致后续参数和返回值中的符号无法被识别。 5. **静态方法的特殊性** - 静态方法**不能使用类的参数**(如`class MyClass<T>`中的`T`),因为类的参数实例绑定,而静态方法不依赖实例。 - 静态方法若需,必须**独立声明自己的参数**,且严格遵循上述语法顺序。 **总结** 参数必须声明在方法修饰符(如`static`)之后、返回值类之前,顺序不可颠倒。这是Java语法强制要求的,否则会导致编译错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值