java泛型中的自限定类型有什么作用?具体举个例子,一个应用场景
8条回答 默认 最新
关注
@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的子类只能和自己同类的实例进行比较。
解决 5无用
- 柯南在写代码 2018-01-18 08:01关注解决 1无用
- elliott66 2018-01-18 03:55关注
自限定所做的就是要求在继承关系中,强制要求将正在定义的类当做参数传递给基类。可以保证类型参数必须与正在被定义的类相同:
1.提高了可读性,一看便知道里面放的是什么。
2.提高了安全性,防止对象的转换出错。class SelfBounded>{
T element;
SelfBounded set(T arg){
element=arg;
return this;
}
T get(){return element;}
}class A extends SelfBounded{}
class B extends SelfBounded{}
class C extends SelfBounded{
C setAndGet(C arg){
set(arg);
return get();
}
}
class D{}//因为类D没有继承SelfBounded,所以该类编译失败。
//class E extends SelfBounded{}class SelfBounding {
public static void main(String[] args) {
A a=new A();
a.set(new A());
a=a.set(new A()).get();
a=a.get();
C c=new C();
c=c.setAndGet(new C());
}
}解决 无用评论 打赏 举报 - threenewbee 2018-01-18 05:43关注解决 无用评论 打赏 举报
- sglhsay 2018-01-18 08:52关注解决 无用评论 打赏 举报
- u010747920 2018-01-18 11:53关注解决 无用评论 打赏 举报
- zhang_senlin 2018-01-18 18:05关注解决 无用评论 打赏 举报
- huibinwei 2018-01-18 21:33关注解决 无用评论 打赏 举报