本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(1)

Java泛型

发布于2021-03-10 18:49     阅读(1399)     评论(0)     点赞(22)     收藏(2)


 


Java泛型

泛型类

即把不确定的数据元素类型用一个泛型占位符表示

@Data
public class Person<T> {
    private T name;
    private T address;
}
Person<String> person= new Person<>();
person.setName("attack204");
System.out.println(person.getName());

多类型泛型

即需要传递多个类型占位符,一个常见的应用是map

@Data
public class MyMap<K, V> {
    private K key;
    private V value;
    public void setKeyAndValue(K key, V value) {
        this.key = key;
        this.value = value;
    }
}
MyMap<String, Integer> myMap = new MyMap<>();
myMap.setKeyAndValue("attack204", 2333);
System.out.println(myMap.getKey());
System.out.println(myMap.getValue());

普通方法泛型

@Data
public class Person<T> {
    private T name;
    private T address;
    //以下两种方法都可以
    public String show(T inputName) {
        return inputName + "is showing";
    }
    public <E> String show2(E input) {
        return input + "is showing two";
    }
}
        Person<String> person = new Person<>();
        System.out.println(person.show("attack204"));
        System.out.println(person.show2("attack203"));

静态方法泛型

@Data
public class Person<T> {
    private T name;
    private T address;
    //注意,静态方法只能调用静态变量,T不是静态变量
    //因此不能写成 public static String show(T inputName) {
    public static <E> String show(E inputName) {
        return inputName + "is showing";
    }
}
System.out.println(Person.show("attack204"));

泛型接口

和上面差不多一样

  • interface
public interface PersonInt<T> {
    public String show(T name);
}
  • implement
public class PersonImpl implements PersonInt<String> {
    @Override
    public String show(String name) {
        return name + "is showing three";
    }
}

或者

public class PersonImpl<T> implements PersonInt<T> {
    @Override
    public String show(T name) {
        return name + "is showing three";
    }
}
  • main
PersonImpl person = new PersonImpl();
System.out.println(person.show("attack204"));

或者

PersonImpl<String> person = new PersonImpl<>();
System.out.println(person.show("attack204"))

擦除模式

  • 定义:java中的泛型只存在于编译阶段,在反射阶段会被擦除。

考虑这样一段代码

Person<String> p = new Person<>();
Person<Integer> p1 = new Person<>();
system.out.println(p == p1);
//true
  • 目的:为了兼容低版本的jdk

通配符

在泛型中不识别父子继承关系(具体见视频)

因此需要通配符<?>来解决此错误

上边界与下边界

用了<?>相当于此处可以是任意类型,但是有时候需要对其进行限定

<? extends T>表示只能传入T及其子类,需要读取,但不写入时使用

<? super T> 表示只能传入T及其父类,需要写入,但不读取时使用

参考资料

b站视频

原文链接:https://www.cnblogs.com/attack204/p/14490060.html



所属网站分类: 技术文章 > 博客

作者:Djfj

链接:http://www.javaheidong.com/blog/article/112220/6be2c7a1034e12b54a4e/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

22 0
收藏该文
已收藏

评论内容:(最多支持255个字符)