精华内容
下载资源
问答
  • 2021-11-18 14:14:31

    一. 面试题及剖析

    1. 今日面试题

    今天 壹哥 带你复习一个不是很容易理解的知识点,即泛型。关于泛型的面试题其实不是很多,常见的题目如下:

    请说一下泛型的作用,泛型类和泛型方法有什么区别?

    2. 题目剖析

    关于泛型,对于初学Java的学生来说,其实并不是很容易理解,刚开始的时候,可能拿不准这个泛型到底是干嘛的。但是开发时,泛型用的还是很多的,尤其是在使用集合的时候,还有想声明一些通用类型的时候,都可能会接触到泛型。其实一旦用的多了,泛型也是很容易理解的。

    二. 泛型

    1. 为什么要学泛型?

    对于初学者来说,泛型确实有点不好理解,尤其是弄不清楚为什么要学泛型?泛型到底有什么作用?别急,壹哥 先带各位看一个经典案例,代码如下:

        public static void main(String[] args) {
            //定义集合
            List list = new ArrayList();
            list.add("一一哥");
            list.add(100);
            list.add(true);
    
    
    更多相关内容
  • 泛型类和泛型方法

    千次阅读 2018-07-06 11:01:05
    泛型类:直接在/接口上定义的泛型使用泛型:保证前后类型相同List<String> list=new ArrayList<>()从Java7开始推出泛型的菱形语法泛型不存在继承的关系List<Object> ...

    泛型类:直接在类/接口上定义的泛型

    使用泛型:

    保证前后类型相同

    List<String> list=new ArrayList<>()从Java7开始推出泛型的菱形语法

    泛型不存在继承的关系List<Object> list=new ArrayList<String>();//错的

    从此以后,使用集合都得使用泛型来约束该集合中元素的类型

    通过反编译发现:泛型其实只是语法糖,底层依然没有泛型,而且依然使用强转

     ---------------------------------------------------------------------------------------------

    泛型方法:在方法上声明泛型

    情况1:泛型类中的泛型只能适用于非静态方法,如果需要给静态方法设置泛型,此时使用泛型方法

    情况2:泛型类中的泛型应该适用于整个类中多个方法,有时候只对一个方法设置泛型即可

    一般的,把自定义的泛型作为方法的返回类型才有意义,而且此时的泛型必须是有参数设置进来的‘

    public static <T> T  doWork(T val){

        return val;

    }



    展开全文
  • 泛型(Generic type 或者 generics)是对Java语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的。可以在集合框架(Collection framework)中看到泛型的动机。例如,Map 允许您向一个 Map 添加任意的...

    1.泛型是什么?

    泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。

    可以在集合框架(Collection framework)中看到泛型的动机。例如,Map 类允许您向一个 Map 添加任意类的对象,即使最常见的情况是在给定映射(map)中保存某个特定类型(比如 String)的对象。

    因为 Map.get() 被定义为返回 Object,所以一般必须将 Map.get() 的结果强制类型转换为自己期望的类型,如:

    Map m = new HashMap();

    m.put("key", "blarg");

    String s = (String) m.get("key");

    但是有可能某人已经在该映射中保存了不是 String 的东西,这样的话,上面的代码将会抛出 ClassCastException。

    理想情况下,您可能会得出这样一个观点,即 m 是一个 Map,它将 String 键映射到 String 值。这可以让您消除代码中的强制类型转换,同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中。这就是泛型所做的工作。

    2.泛型的好处

    Java 语言中引入泛型是一个较大的功能增强。不仅语言、类型系统和编译器有了较大的变化,以支持泛型,而且类库也进行了大翻修,所以许多重要的类,比如集合框架,都已经成为泛型化的了。这带来了很多好处:

    类型安全。 泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。

    Java 程序中的一种流行技术是定义这样的集合,即它的元素或键是公共类型的,比如“String 列表”或者“String 到 String 的映射”。通过在变量声明中捕获这一附加的类型信息,泛型允许编译器实施这些附加的类型约束。类型错误现在就可以在编译时被捕获了,而不是在运行时当作 ClassCastException 展示出来。将类型检查从运行时挪到编译时有助于您更容易找到错误,并可提高程序的可靠性。

    消除强制类型转换。 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。

    尽管减少强制类型转换可以降低使用泛型类的代码的罗嗦程度,但是声明泛型变量会带来相应的罗嗦。比较下面两个代码例子。

    该代码不使用泛型:

    List li = new ArrayList();

    li.put(new Integer(3));

    Integer i = (Integer) li.get(0);

    该代码使用泛型:

    List li = new ArrayList();

    li.put(new Integer(3));

    Integer i = li.get(0);

    在简单的程序中使用一次泛型变量不会降低罗嗦程度。但是对于多次使用泛型变量的大型程序来说,则可以累积起来降低罗嗦程度。

    潜在的性能收益。 泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的 JVM 的优化带来可能。

    由于泛型的实现方式,支持泛型(几乎)不需要 JVM 或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型时所写的代码,只是更能确保类型安全而已。

    3.泛型用法的例子

    下面的代码示例展示了 JDK 5.0 中集合框架中的 Map 接口的定义的一部分:

    public interface Map {

    public void put(K key, V value);

    public V get(K key);

    }

    注意该接口的两个附加物:

    类型参数 K 和 V 在类级别的规格说明,表示在声明一个 Map 类型的变量时指定的类型的占位符。

    在 get()、put() 和其他方法的方法签名中使用的 K 和 V。

    为了赢得使用泛型的好处,必须在定义或实例化 Map 类型的变量时为 K 和 V 提供具体的值。以一种相对直观的方式做这件事:

    Map m = new HashMap();

    m.put("key", "blarg");

    String s = m.get("key");

    当使用 Map 的泛型化版本时,您不再需要将 Map.get() 的结果强制类型转换为 String,因为编译器知道 get() 将返回一个 String。

    在使用泛型的版本中并没有减少键盘录入;实际上,比使用强制类型转换的版本需要做更多键入。使用泛型只是带来了附加的类型安全。因为编译器知道关于您将放进 Map 中的键和值的类型的更多信息,所以类型检查从执行时挪到了编译时,这会提高可靠性并加快开发速度。

    4.命名类型参数

    推荐的命名约定是使用大写的单个字母名称作为类型参数。这与 C++ 约定有所不同(参阅 附录 A:与 C++ 模板的比较),并反映了大多数泛型类将具有少量类型参数的假定。对于常见的泛型模式,推荐的名称是:

    K —— 键,比如映射的键。

    V —— 值,比如 List 和 Set 的内容,或者 Map 中的值。

    E —— 异常类。

    T —— 泛型。

    5.泛型不是协变的

    关于泛型的混淆,一个常见的来源就是假设它们像数组一样是协变的。其实它们不是协变的。List 不是 List 的父类型。

    如果 A 扩展 B,那么 A 的数组也是 B 的数组,并且完全可以在需要 B[] 的地方使用 A[]:

    Integer[] intArray = new Integer[10];

    Number[] numberArray = intArray;

    上面的代码是有效的,因为一个 Integer 是 一个 Number,因而一个 Integer 数组是 一个 Number 数组。但是对于泛型来说则不然。下面的代码是无效的:

    List intList = new ArrayList();

    List numberList = intList; // invalid

    这样做很多人觉得麻烦,但避免了如下的问题:

    Person[] person = new Student[5];

    person[0] = new Emploee();

    6.类型通配符

    假设您具有该方法:

    void printList(List l) {

    for (Object o : l)

    System.out.println(o);

    }

    上面的代码在 JDK 5.0 上编译通过,但是如果试图用 List 调用它,则会得到警告。出现警告是因为,您将泛型(List)传递给一个只承诺将它当作 List(所谓的原始类型)的方法,这将破坏使用泛型的类型安全。

    如果试图编写像下面这样的方法,那么将会怎么样?

    void printList(List l) {

    for (Object o : l)

    System.out.println(o);

    }

    它仍然不会通过编译,因为一个 List 不是 一个 List(正如前一屏 泛型不是协变的 中所学的)。这才真正烦人 —— 现在您的泛型版本还没有普通的非泛型版本有用!

    解决方案是使用类型通配符:

    void printList(List> l) {

    for (Object o : l)

    System.out.println(o);

    }

    上面代码中的问号是一个类型通配符。它读作“问号”。List> 是任何泛型 List 的父类型,所以您完全可以将 List、List 或 List>> 传递给 printList()。

    展开全文
  • 如果被方法是用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。为了让不同的方法可以操作不同类型,而且类型还不确定。那么可以将泛型定义在方法上。泛型类class Demo{public void show...

    泛型类定义的泛型,在整个类中有效。如果被方法是用,那么

    泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。

    为了让不同的方法可以操作不同类型,而且类型还不确定。那么

    可以将泛型定义在方法上。

    泛型类

    class Demo

    {

    public void show(T t)

    {

    System.out.println("show: "+t);

    }

    public void print(T t)

    {

    System.out.println("show: "+t);

    }

    }

    class GenericDemo4

    {

    public static void main(String[] args)

    {

    Demod = new Demo();

    d.show(new Integer(4));

    Demod1 = new Demo();

    d1.print("haha");

    }

    }

    结果:

    show: 4

    show: haha

    泛型方法

    class Demo

    {

    public void show(T t)

    {

    System.out.println("show: "+t);

    }

    public void print(Q q)

    {

    System.out.println("print:"+q);

    }

    }

    class GenericDemo4

    {

    public static void main(String[] args)

    {

    Demo d = new Demo();

    d.show("hello boy!");

    d.print("Alex i love you !");

    }

    }

    结果:

    show: hello boy!

    print:Alex i love you !

    同时定义泛型类和泛型方法

    class Demo

    {

    public void show(T t)

    {

    System.out.println("show: "+t);

    }

    public void print(Q q)

    {

    System.out.println("print:"+q);

    }

    }

    class GenericDemo4

    {

    public static void main(String[] args)

    {

    Demo d = new Demo();

    d.show("hello boy!");

    d.print("Alex i love you !");

    d.print(5);

    d.print("heiei");

    }

    }

    结果:

    show: hello boy!

    print:Alex i love you !

    print:5

    print:heiei

    特殊之处:

    静态方法不可以访问类上定义的泛型

    如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。

    class Demo

    {

    public void show(T t)

    {

    System.out.println("show: "+t);

    }

    public void print(Q q)

    {

    System.out.println("print:"+q);

    }

    public static void method(W t)

    {

    System.out.println("method: "+t);

    }

    }

    class GenericDemo4

    {

    public static void main(String[] args)

    {

    Demo d = new Demo();

    d.show("hello boy!");

    d.print("Alex i love you !");

    d.print(5);

    d.print("heiei");

    Demo.method("hihi");

    }

    }

    结果:

    show: hello boy!

    print:Alex i love you !

    print:5

    print:heiei

    method: hihi

    泛型定义在接口上

    interface Inter

    {

    void show(T t);

    }

    //第一种

    class InterImpl implements Inter

    {

    public void show(String t)

    {

    System.out.println("show :"+t);

    }

    }

    /*第二种

    class InterImplimplements Inter

    {

    public void show(T t)

    {

    System.out.println("show :"+t);

    }

    }

    */

    class GenericDemo5

    {

    public static void main(String[] args)

    {

    /*

    InterImpl i = new InterImpl();

    i.show(4);

    */

    InterImpl i = new InterImpl();

    i.show("haha");

    }

    }

    结果:

    show :haha

    第一种相对来说就比较死,固定为String类型了。而第二种可以自己定义。

    展开全文
  • 泛型可以理解为参数化类型,主要作用在,方法和接口上。 Java泛型 与 C++ 模板 : Java 中的泛型 , 是仿照 C++ 中的模板开发的 , 目的是让开发者可以写出通用,灵活的代码 。 伪泛型 : Java中的泛型 , 是伪泛型 , Java...
  • 通用 使用Java中的泛型类和泛型方法显示了Stack的应用。
  • 泛型类和泛型方法看起来似乎可以实现类似的功能,但是很多人并未真正掌握泛型方法,网上很多文章说了很多还是似是而非,特别是初学者还是搞不明白。 1.泛型方法可以独立于泛型类 2.泛型方法等效于泛型类泛型...
  • 泛型泛型类泛型方法

    千次阅读 2022-03-16 10:40:33
    1. public 返回类型中间的标识符,**可以理解为**,声明该方法泛型方法 2. 只有声明了的方法泛型方法泛型类中的成员方法**不是**泛型方法 3. 表明,该方法使用泛型类型T,可以使用在**返回类型,传入参数...
  • Java 泛型 一、概述 Java 泛型(generics)是 JDK 1.5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。 1.1 什么是泛型泛型,即参数化类型。 一提到参数,...
  • C#泛型类和泛型方法

    2019-10-21 20:16:46
    泛型可以理解为广泛的类型,或者不确定的类型,也就是说允许我们编写一个可以与任何数据类型同时运行,且不报错的方法或者泛型类 泛型类是指这个的某些字段的类型是不确定的,只有在构造的时候才能确定下的...
  • 泛型类和泛型方法,区别

    千次阅读 2018-01-22 13:31:23
    泛型类中,“ 在泛型方法方法后面的“ 除了上述的两种情况,范型方法还有一个经典的用法。。 ...下面是泛型类和泛型方法的几个书写...”,只有在泛型方法的参数的类型和泛型类的类型相同时,才能有字母代替,且是
  • C#基础:泛型类和泛型方法

    千次阅读 2018-11-23 14:56:40
    C#中的泛型能够将类型作为参数传递,创建类型是用符号T作为占位符...定义泛型类:  public class Farm&lt;T&gt; :IEnumerator&lt;T&gt; where T :Animal//泛型类使用where关键字进行约束  { ...
  • 泛型类: using System; namespace ThreadDemo { class Program { static void Main(string[] args) { MyStack<int> myStack = new MyStack<int>(3); myStack.Push(1); myStack.Push(2);
  • 下面小编就为大家带来一篇浅谈java中定义泛型类和定义泛型方法的写法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 这种参数可以用在方法和接口中,分别被称为泛型类泛型方法泛型接口。 泛型定义格式: <类型>:指定一种类型的格式。这里的类型可以看成是形参。 <类型1,类型2…>:指定多种类型的格式,多种...
  • 泛型方法 1. 泛型的提出 List中默认的类型是Object,当我们向List中传入数字字符串的时候可以执行,但是当要输出的时候就让人头疼。这时候泛型就出来了,可以指定List中传入对象的类型。当传入与指定类型不一样的...
  • Java中的泛型类和泛型方法区别联系

    千次阅读 热门讨论 2015-03-21 14:09:01
    泛型的概念大家应该都会,不懂的百度或者google,在java中泛型类的定义较为简单public abstract class BaseEaoImpl implements BaseEao{} 这样就定义了一个泛型类,在实例化这个的时候,必须指明泛型T的具体类型...
  • 主要给大家介绍了Spring中如何初始化泛型类,文中给出详细的介绍和方法实例,对大家的理解和学习具有一定的参考借鉴价值,有需要的朋友可以参考学习,下面来一起看看吧。
  • JAVA容器之泛型类泛型方法
  • 【Flutter】Dart 泛型 ( 泛型类 | 泛型方法 | 特定类型约束的泛型 ) https://hanshuliang.blog.csdn.net/article/details/114059611 博客源码快照
  • 泛型类泛型方法泛型接口、泛型委托 泛型类泛型方法泛型接口、泛型委托
  • 这种参数类型可以用在、接口和方法的创建中,分别成为泛型类泛型接口、泛型方法 优缺点: ​ 优点:可以不用再类型转换了 ​ 缺点:降低了代码的可读性 泛型类 泛型类:当一个要操作的引用数据类型不确定...
  • 主要介绍了Java泛型类泛型方法的定义,结合实例形式详细分析了java泛型类泛型方法定义、用法及相关操作注意事项,需要的朋友可以参考下
  • Java泛型泛型类泛型方法详解

    千次阅读 2020-05-22 16:52:10
    这种参数类型可以用在、接口和方法的创建中,分别称为泛型类泛型接口、泛型方法。 Java泛型被引入的好处是安全简单。在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,...
  • Java自定义泛型类和泛型方法

    千次阅读 2018-07-29 16:20:46
    泛型类 定义:定义时使用泛型。 格式:&lt;&gt; class 类名&lt;字母列表&gt;{ 修饰符 字母 属性; 修饰符 构造器(字母){ } 修饰符 返回类型 方法(字母) } //不能...
  • 2.什么是泛型泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,...
  • 方法中出现了泛型的结构,泛型参数与泛型参数没有任何关系,换句话说,泛型方法所属的是不是泛型类都没关系 泛型方法在调用时指明泛型参数的类型,并非在实例化时确定, arr给E指挥的类型是integer,并且...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 441,779
精华内容 176,711
关键字:

泛型类和泛型方法

友情链接: amr.rar