最近在看thinking in java的泛型一章,看得头晕,感觉这泛型好绕啊,
问下无界通配符与原生类的区别:
class TestHolder <T>{
private T value ;
public TestHolder() {}
public TestHolder(T val) {
value = val ;
}
public void set(T val) { value = val ;}
public T get() { return value ;}
public boolean equals(Object obj) {
return value.equals(obj) ;
}
}
public class Wildcards {
static void rawArgs(TestHolder holder, Object arg) {
holder.set(arg) ; //会有警告,但不会有错误
holder.set(new Wildcards()) ;
}
static void unboundedArg(TestHolder<?> holder, Object obj) {
holder.set(arg) ; //会有错误
Object obj = holder.get() ;
}
}
为什么rawArgs方法内的holder.set(arg)不会有错误,而unboundedArg方法内的holder.set(arg)会有错误啊?
望大家指教啊
问下无界通配符与原生类的区别:
class TestHolder <T>{
private T value ;
public TestHolder() {}
public TestHolder(T val) {
value = val ;
}
public void set(T val) { value = val ;}
public T get() { return value ;}
public boolean equals(Object obj) {
return value.equals(obj) ;
}
}
public class Wildcards {
static void rawArgs(TestHolder holder, Object arg) {
holder.set(arg) ; //会有警告,但不会有错误
holder.set(new Wildcards()) ;
}
static void unboundedArg(TestHolder<?> holder, Object obj) {
holder.set(arg) ; //会有错误
Object obj = holder.get() ;
}
}
为什么rawArgs方法内的holder.set(arg)不会有错误,而unboundedArg方法内的holder.set(arg)会有错误啊?
望大家指教啊
解决方案 »
- 为什么重写equals方法的同时要重写hashCode方法
- 多态问题
- 没有get方法能取到对象private字段的值吗
- 求教一个函数的写法修改意见
- 关于IO流
- 两个正则的区别
- 谁能把这c程序用改成java
- 绝对奇怪问题,做java很久了,奇怪问题遇到不少
- 当timer.schedule(oneTimerTask, date, PERIOD)第一次运行时,并不都在“date”时才启动,只要大于这个date的任何时刻它都可以启动,为什
- (●●●●,高分)在Applet中,关于Button与JButton的用法????见内容(在线等待)
- Java 垃圾回收的问题,请教
- 小弟又来了 JAVA中TextField不接收传值的问题与疑惑
static <T> T exact1(TestHolder<T> holder) {
T t = holder.get() ;
return t ;
} static <T> T exact2(TestHolder<T> holder, T arg) {
holder.set(arg);
T t = holder.get() ;
return t ;
}
public static void main(String[] args) {
TestHolder<Long> qualified = new TestHolder<Long>();
TestHolder<?> unbounded = new TestHolder<Long>() ;
TestHolder<? extends Long> bounded = new TestHolder<Long>() ;
Long lng = 1L ; Long l1 = exact1(qualified,lng); //不会报错
Object r = exact1(unbounded); //不会报错
Long l2 = exact2(qualified,lng); //不会报错
Long l3 = exact2(bounded,lng); //报错
}
}帮忙解释一下
holder.set(arg) ; //会有错误
Object obj = holder.get() ;
}
你上面的参数是"Object obj"下面set(arg)当然错啦,arg哪里来的?