Java泛型

简介: 版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/twilight_karl/article/details/55805693 泛型类1,泛型表示的类型不能是基本类型,只能是引用类型,比如int,float等等都不可以作为泛型的类型,但是可以用相应的包装类代替,如int可以表示为Integer。
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/twilight_karl/article/details/55805693

泛型类

1,泛型表示的类型不能是基本类型,只能是引用类型,比如int,float等等都不可以作为泛型的类型,但是可以用相应的包装类代替,如int可以表示为Integer。String不是基本类型。
2,让方法局限在特定类型下:

//泛型类实例
public class test01 <T> {
    private T name;
    private T sex;

    public T getName() {
        return name;
    }

    public void setName(T name) {
        this.name = name;
    }


    public static void main(String[] args) {
        test01<String> test = new test01();
        test.setName("张三");
        System.out.println(test.getName());
    }
}

泛型方法

泛型方法可以用在非泛型的类中,使用方法是在放回类型之前加: <类型>
然后该类型就可以在这个函数中使用
如:

public <T> void fun(T e){}
public <T> String fun(T e){}

继承泛型类

已有泛型类 class abstract Father

擦除

使用,实现,继承父类时,父类没有指定泛型的类型
现在有泛型类Test:

public class Test <T> {
    T a;
    public <T> void test (T t){
        System.out.println(t);
    }
}

如果在使用时不指定T的类型,T的用法类似于Object类型,因此下面这段代码不会报错:

public static void main(String [] args){
        Test<Object> test = new Test<Object>();
        Test<String> test2 = new Test<String>();
        test.test(test2);
}

但是,不指定类型并不完全等同于Object,下面的代码执行时会因为类型不匹配而报错

    public static void ss(Test2<Object> t){}

    public static void main(String [] args){
        Test<String> test = new Test<Object>();
        ss(test); //报错
    }

通配符 ?

表示类型不确定,只能用于声明变量,不能用于创建对象,不能用于创建泛型类,不能用于泛型方法上。

List <?> list = new ArrayList<Integer>(); //正常
List <?> list4 = new ArrayList<?>(); //报错
public <?> void test2(String t){} //报错

上限

? extends Fruit
表示Frut类型和Fruit类型的所有子类,子类的子类也可以,例如有下面的继承关系:

class Fruit{}
class Apple extends Fruit{}
class pear extends Fruit{}
class RedApple extends Apple{}

下面是使用时出现的几种情况。
的效果等同于 ? extends Object 。因此List<?> 与List<? extends Fruit>不匹配

    public static void test1(List<? extends Fruit> s){}

    public static void main(String[] args) {
        List<? extends Fruit> list1 = new ArrayList<Fruit>();
        List<? extends Apple> list2 = new ArrayList<RedApple>();
        List<?> list3 = new ArrayList<Fruit>();
        test1(list1);   //正常
        test1(list2);   //正常
        test1(list3);   //报错
    }

形参为List

    public static void test1(List<? extends Fruit> s){
        s.add(new Fruit()); //报错
    }

下限

super与extends相反。表示父类或自身。可能的几种情况:

    public static void test(List <? super Apple> s){}
    public static void main(String[] args) {
        List<Fruit> list1 = new ArrayList<Fruit>();
        List<RedApple> list2 = new ArrayList<RedApple>();
        List<? super Apple> list3 = new ArrayList<RedApple>(); //报错
        List<?> list4 = new ArrayList<Apple>();
        List<? super RedApple> list5 = new ArrayList<RedApple>();

        test(list1);        //正常
        test(list2);        //报错
        test(list4);        //报错
        test(list5);        //报错
    }

可以通过泛型的嵌套访问hashmap中的Entry

        Map<String,String> map = new HashMap();
        map.put("1", "a");
        map.put("2","b");
        Set<Entry<String,String>> s = map.entrySet();
        for(Entry<String,String> temp : s){
            System.out.println(temp.getValue());
        }
相关文章
|
13天前
|
Java 编译器 容器
Java 泛型
Java 泛型
20 10
|
9天前
|
存储 安全 Java
Java泛型(1)
Java泛型(1)
24 13
|
1天前
|
存储 安全 Java
Java中的泛型编程详解
Java中的泛型编程详解
|
6天前
|
存储 安全 Java
JAVA 泛型新篇章:编译时类型安全的新境界!
【6月更文挑战第28天】Java 泛型增强了编译时类型安全,避免运行时类型转换异常。例如,未使用泛型的代码可能因隐含的类型转换抛出`ClassCastException`。泛型允许指定容器如`List&lt;String&gt;`的元素类型,确保编译期检查。此外,泛型类如`Stack&lt;T&gt;`能适应多种类型,提高代码重用。使用泛型方法如`&lt;T&gt; void processElements(List&lt;T&gt;)`可增强方法的通用性。泛型是Java中提升可靠性和灵活性的关键工具。
|
13天前
|
安全 Java 编译器
在Java中,什么是类型擦除机制,如何有效运用泛型的类型擦除机制?
Java的类型擦除机制在编译时移除了泛型的类型参数信息,生成的字节码不包含泛型,以确保向后兼容。这导致运行时无法直接获取泛型类型,但编译器仍做类型检查。为了有效利用类型擦除,应避免运行时类型检查,使用通配符和界限增加代码灵活性,通过超类型令牌获取泛型信息,以及利用泛型方法来保证安全性。理解这些策略能帮助开发者编写更安全的泛型代码。
30 8
|
3天前
|
安全 算法 Java
Java中的泛型详解:边界、类型擦除与实际应用
Java中的泛型详解:边界、类型擦除与实际应用
|
6天前
|
存储 安全 Java
JAVA泛型:类型安全,从编译时开始!
【6月更文挑战第28天】Java泛型是JDK 5引入的特性,用于在编译时实现类型安全的集合。它通过类型参数增强代码灵活性和重用性,减少错误。示例展示了泛型列表`List&lt;Integer&gt;`和`List&lt;String&gt;`如何确保元素类型正确,防止编译时类型不符。泛型提升了代码的类型安全、可读性和维护性。
|
6天前
|
存储 安全 Java
探索JAVA泛型:让代码在编译时就拥有金钟罩铁布衫!
【6月更文挑战第28天】Java泛型,自1.5版起,是代码安全性的守护者。它允许在类、接口和方法中使用类型参数,减少重复代码,提升可读性。泛型在编译时执行类型检查,防止运行时类型错误,如同给代码穿上“金钟罩铁布衫”。以Box类为例,泛型避免了显式转换,确保类型安全,让编程更加高效和无忧。
|
6天前
|
安全 Java 编译器
JAVA泛型,编译时类型安全的“秘密武器”
【6月更文挑战第28天】Java泛型是JDK 5引入的特性,用于在编译时增强类型安全和代码复用。它允许类、接口和方法使用类型参数,确保运行时类型匹配,减少了类型转换错误。例如,泛型方法`&lt;T&gt; void printArray(T[] array)`能接受任何类型数组,编译器会检查类型一致性。此外,泛型提升了代码的可读性、可维护性和与容器类的配合效率,优化整体软件质量。
|
6天前
|
存储 安全 Java
JAVA泛型:为何它是编程界的“安全卫士”?
【6月更文挑战第28天】Java泛型增强了代码复用、可读性和类型安全。它们引入类型参数,允许在编译时检查类型,防止运行时异常。例如,泛型ArrayList防止了不兼容类型的添加,而泛型方法和类减少了重复代码。示例展示了泛型类`Box&lt;T&gt;`、泛型方法`printArray&lt;T&gt;`和泛型接口`Printer&lt;T&gt;`的使用,强调了泛型在确保类型安全和灵活性方面的价值。