Coding365 2018-01-18 03:44 采纳率: 0%
浏览 3269
已结题

java泛型中的自限定类型有什么作用

java泛型中的自限定类型有什么作用?具体举个例子,一个应用场景

  • 写回答

8条回答 默认 最新

  • 不去天涯 博客专家认证 2018-01-20 01:07
    关注

    @caozhy 给出了限定类型泛型的作用,即,限制类型参数的范围,同时可以使用限定的界限包含的方法。比如caozhy提出的例子调整成可用的形式:

        public static <T extends Number> void sort(List<T> col) {
            for (int i = 0; i < col.size() - 1; i++)
                for (int j = i; i < col.size() - 1; j++) {
                    if (col.get(j).longValue() > col.get(j + 1).longValue()) {//可以直接使用Number的方法
                        // 交换
                    }
                }
        }
    

    什么样的是自限定类型呢?即,限定范围就是自身。比如一个实现了Comparable接口的的User类,希望只能和User类的实例进行比较,那么我们需要这样写:

        static class User2 implements Comparable<User2>{
            public int compareTo(User2 o) {
                //
            }   
        }
    

    这样就利用了限定类型的两个用处:1.限定范围;2.可以使用限定类的方法。另外一个点,就是限定了只能是同类型的进行比较。

    我们再来看一个更复杂的,jdk里的Enum类定义:

     public abstract class Enum<E extends Enum<E>>
            implements Comparable<E>, Serializable{
    }
    

    这是一个更复杂的限定类型,为什么要这么复杂呢?如果我们写成简单的样子行不行?像这样:

     public abstract class Enum
            implements Comparable<Enum>, Serializable{
    }
    

    (关于Enum类和子类之间的关系,可以参考这里:https://www.cnblogs.com/ly-radiata/articles/6049822.html)
    不是同样可以起到限定范围在Enum类么?为什么又要多次一举,弄得这么复杂?
    这和Enum类的作用有关系,Enum这个抽象类是用来被继承的,所以我们总是在定义和使用Enum的子类,而且我们希望enum Day和enum Month只能自己的枚举值之间进行比较,而不能互相比较。比如Monday和January就不能比较,因为比较是没有意义的。

    看明白了这里,我们再来看一下,简化了的Enum能不能达到上述的限制目的?

     class Day extends Enum{
     }
    
     class Month extends Enum{
     }
    
     public satic void main(String[] args){
         Day monday = new Day("monday");
             Month january = new Month("january");
         monday.compareTo(january);// 1
     }
    

    上述1位置的compareTo方法,在简化的Enum情况下是可以的,但是在jdk中复杂的Enum下是不可以的。这也就是为什么jdk里的Enum要定义的这么复杂,目的就是为了限制Enum的子类只能和自己同类的实例进行比较。

    评论
编辑
预览

报告相同问题?

悬赏问题

  • ¥35 spaceclaim脚本
  • ¥15 MC9S12XS128单片机实验
  • ¥15 失败的github程序安装
  • ¥15 WSL上下载的joern在windows怎么用?
  • ¥15 jetson nano4GB
  • ¥15 电脑回复出厂设置,重装过程报错提示,求解决方案Windows 无法分析或处理无人参与应答文件 [C:\WINDOWS\Panther\unattend.xml,如何解决?
  • ¥15 进入lighttools中的UDOP编辑器的方法
  • ¥15 求Gen6d训练数据集
  • ¥20 liunx中winscp中可以登入ftp,但是不能登入sftp,如何解决
  • ¥15 lighttools的光学属性自定义的用法流程