泛型类及方法的基本使用

1、定义

 public class EntBase<T>:where  T: new()
    {
        public List<T> GetListDemo()
        {
            var lst = new List<T>();
            for (int i = 1; i <= 35; i++)
            {
                var ent = new T();
                foreach (var item in ent.GetType().GetProperties())
                {
                    var v = (DescriptionAttribute[])item.GetCustomAttributes(typeof(DescriptionAttribute), false);
                    var descriptionName = v[0].Description;

                    item.SetValue(ent, descriptionName + ":" + i.ToString(), null);
                }

                lst.Add(ent);
            }
            return lst;
        }

        public string GetJsonDemo<T>()
        {
            var oSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();  //命名空间为:System.Web.Extensions
            string sJSON = oSerializer.Serialize(GetListDemo<T>());
            return sJSON;
        }
    }

 

2、使用

 

   var ent = new EntBase<EquipQryEnt>();
            var lst = ent.GetListDemo();

 

<think>好的,我现在需要回答用户关于Java中泛型类和泛型方法的区别及用法的问题。首先,我应该回顾一下用户提供的参考资料,确保理解正确。用户提供了三个引用,其中引用[1]提到了如何编写泛型方法,并给出了一个例子;引用[2]讨论了显式指定类型参数的方法;引用[3]则说明了泛型在安全性和类型转换上的优势。 首先,我需要明确泛型类和泛型方法基本定义。泛型类是在类声明时引入类型参数,使得整个类可以使用这个类型参数,比如`public class TestMethod<U> { ... }`。而泛型方法则是在方法声明时引入自己的类型参数,这些参数的作用域仅限于该方法,例如`public <T, S> T testMethod(T t, S s) { ... }`。 接下来,我需要比较它们的区别。首先是作用域的不同:泛型类的类型参数作用于整个类,而泛型方法的类型参数仅在该方法内有效。然后是声明位置的不同:泛型类的类型参数在类名后声明,泛型方法的在方法返回类型前。使用场景方面,泛型类适用于整个类需要处理同一类型的情况,比如集合类如`List<T>`;泛型方法则适用于方法的逻辑独立于类本身的类型参数,比如工具类中的静态方法。 然后,我需要考虑用户可能的疑问点,比如何时选择泛型类而不是泛型方法,或者两者如何结合使用。例如,如果类中有多个方法需要使用相同的类型参数,那么泛型类更合适;如果某个方法需要自己独立的类型参数,即使类本身不是泛型的,也可以使用泛型方法。 还要注意用户提到的显式指定类型参数的情况,如引用[2]中的例子,这在泛型方法中可能需要显式指定类型,尤其是在编译器无法推断类型时。同时,引用[3]强调泛型带来的安全性,这点在类和方法的上下文中都适用,但需要说明在各自场景中的具体应用。 可能还需要举一些例子来说明,比如泛型类`Box<T>`,其中T在整个类中使用,而泛型方法可以是静态的,比如`Collections.sort`,它可能不依赖于类的类型参数。 最后,需要确保回答结构清晰,分点说明区别、用法和示例,同时引用提供的资料来支持观点。还要生成相关问题,帮助用户进一步理解。</think>### Java泛型类与泛型方法的区别及用法 #### 一、核心概念 1. **泛型类** 在类声明时定义类型参数,作用于整个类范围。例如: ```java public class Box<T> { private T content; public void setContent(T content) { this.content = content; } public T getContent() { return content; } } ``` 使用时需指定具体类型:`Box<String> box = new Box<>();`[^3]。 2. **泛型方法** 在方法声明时定义独立的类型参数,仅作用于该方法。例如引用[1]中的代码: ```java public class TestMethod<U> { public <T, S> T testMethod(T t, S s) { return null; } } ``` 调用时可通过参数类型自动推断或显式指定:`TestMethod.<String>testMethod("data", 100);`[^2]。 --- #### 二、主要区别 | 特性 | 泛型类 | 泛型方法 | |---------------------|--------------------------------|----------------------------------| | **作用域** | 整个类及其实例 | 仅限声明的方法内部 | | **声明位置** | 类名后(如`class Box<T>`) | 方法返回类型前(如`<T> T method()`)| | **类型参数独立性** | 类实例化时确定 | 方法调用时确定 | | **典型应用场景** | 数据结构(如`List<T>`) | 工具方法(如`Collections.sort()`)| --- #### 三、使用场景与选择依据 1. **优先使用泛型类的情况** - 类的多个方法需要共享同一类型参数。 - 类的成员变量依赖泛型类型(如集合容器)。 - 示例:`Map<K, V>`的键值类型贯穿整个类逻辑[^3]。 2. **优先使用泛型方法的情况** - 方法逻辑独立于类本身的泛型参数(如工具类方法)。 - 需要灵活支持多类型组合(如参数与返回类型不同)。 - 示例:`public static <T> T parse(String input, Class<T> clazz)`。 3. **组合使用示例** ```java public class Pair<U, V> { // 泛型类 private U first; private V second; public <T> T convert(Function<Pair<U,V>, T> converter) { // 泛型方法 return converter.apply(this); } } ``` --- #### 四、注意事项 1. **类型擦除**:泛型信息在编译后会被擦除,需避免运行时类型判断(如`if (t instanceof T)`)。 2. **显式类型指定**:当编译器无法推断类型时,需用`ClassName.<Type>method()`语法[^2]。 3. **通配符与边界**:泛型类方法均可使用`extends`和`super`限定类型范围。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值