惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
SegmentFault 最新的问题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog RSS Feed
Y
Y Combinator Blog
T
Tailwind CSS Blog
博客园 - 三生石上(FineUI控件)
J
Java Code Geeks
Stack Overflow Blog
Stack Overflow Blog
aimingoo的专栏
aimingoo的专栏
Jina AI
Jina AI
The GitHub Blog
The GitHub Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
A
About on SuperTechFans
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
Docker
酷 壳 – CoolShell
酷 壳 – CoolShell
C
Check Point Blog
M
MIT News - Artificial intelligence
Last Week in AI
Last Week in AI
V
V2EX
腾讯CDC
F
Fortinet All Blogs
博客园 - 叶小钗
T
The Blog of Author Tim Ferriss

Sehnsucht

记一次博客换图床的过程 观《花束般的恋爱》 读《活过》 东京 旅行篇 亲人逝去 我为什么想养鱼 防止AI爬取你的博客 「monthly 」博客重构 游戏全成就 好看的小说 人生的每一步都不会是浪费-2024年终 「weekly」星期五综合征 「weekly」听播客 杂谈 读《美丽新世界》 「weekly」社交媒体 恶性事件 新世界 「weekly」认知觉醒 美丽新世界 follow 「weekly」独立博客9问题 双十一买书 读《惊呆了!原来这就是社会学》 一次聊天与自我建设 2024-09月记 补番《relife》 树状数组简单理解 lvm简单使用 博客自动发布方案 某公众号废案 fail2ban基本使用 Podman 环境使用 Nginx Proxy Manager 最佳实践 2024-07同学聚会 vps使用podman部署freshrss Gitlab CICD 实践,思考与记录 装备升级:新的PC gitlab局域网搭建流程
泛型类简单理解
2020-10-19 · via Sehnsucht

泛型类

疯狂java讲义中,给出了下面这个例子来描述泛型类

//定义Apple时使用了泛型声明
public class Apple<T> {
    //使用T定义实例变量
    private T info;
    public Apple(){}

    public Apple(T info) {
        this.info = info;
    }

    public T getInfo() {
        return info;
    }

    public void setInfo(T info) {
        this.info = info;
    }

    public static void main(String[] args) {
        //由于传给T形参的是String,所以构造器参数只能是String
        Apple<String> a1 = new Apple<>("苹果");
        System.out.println(a1.getInfo());
        //由于传给T形参的是Double,所以构造器参数只能是Double或double
        Apple<Double> a2 = new Apple<>(5.23);
        System.out.println(a2.getInfo());
    }
}

泛型,简单来讲就是规定类型,在集合中用的比较多,但我们也可以用泛型定义类或者接口甚至方法

泛型类,可以看成是有类型的类

这个类型(泛型形参)可以是自定义的,可以是String,可以是Integer,但是不能是int,double等基本数据类型,有时候,自定义的类型甚至可能是无意义的 这个泛型形参,可以被赋值,就像代码中的 Apple<String> a1 = new Apple<>("苹果");Apple<Double> a2 = new Apple<>(5.23);

T就像是我们的int a中的a,但是实际使用的时候,需要赋值,像例子中赋值的String和Double(不能是double)

还有一个,书上的原话

当创建带泛型声明的自定义类,为该类定义构造器时,构造器名还是原来的类名,不要增加泛型声明。例如为Apple<T>类定义构造器,其构造器名依然是Apple,而不是Apple<T>,但调用该构造器时却可以使用Apple<T>的形式,当然应该为T形参传入实示的类型参數。

这个的话看一下原来的示例代码就明白了

public Apple(T info) {//构造器,没有<>
    this.info = info;
}
Apple<String> a1 = new Apple<>("苹果");//调用的时候可以使用<>

泛型类派生子类

带有泛型声明的接口或者类,创建子类的时候,不能再包含类型形参,而是具体的类型 例如

public class A extends Apple<T>()//错误
public class A extends Apple<String>()//正确

书上说,使用方法时必须把形参给赋值,使用类时倒是不用 但是,可能是我JDK版本(13)比较高的缘故,或者IDEA优化了,使用方法时也可以不用,但是类型就是object的类型了, 或者我理解有误,还请大佬指出

public class A extends Apple{
    public static void main(String[] args) {
        A aa = new A();
        aa.setInfo("hhh");
        System.out.println(aa.getInfo());
    }
}

输出hhh

public class A extends Apple{
    public static void main(String[] args) {
        A aa = new A();
        aa.setInfo("hhh");
        aa.setInfo(4);
        System.out.println(aa.getInfo());
    }
}