如何解决Java中的r=g编译问题?
对于以下泛型类,行r=g存在编译错误: 类型不匹配:无法从GenericTest1转换为GenericTest1 怎么能修好呢如何解决Java中的r=g编译问题?,java,Java,对于以下泛型类,行r=g存在编译错误: 类型不匹配:无法从GenericTest1转换为GenericTest1 怎么能修好呢 public class GenericTest1<T> { private T t; public GenericTest1(T t) { this.t = t; } public void set(T t) { this.t = t; } public T get()
public class GenericTest1<T> {
private T t;
public GenericTest1(T t) {
this.t = t;
}
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
public static void main(String[] args) {
GenericTest1<Integer> g = new GenericTest1<>(6);
GenericTest1<Number> r = g; <==here
}
}
公共类泛型测试1{
私人T;
公共通用测试1(T){
t=t;
}
公共无效集(T){
t=t;
}
公共部门得不到{
返回t;
}
公共静态void main(字符串[]args){
GenericTest1 g=新GenericTest1(6);
GenericTest1 r=g;这里的误解是GenericTest1
是GenericTest1
的一个超类。它不是,所以你必须单独强制每个成员。这里的误解是GenericTest1
是GenericTest1
的一个超类。它不是,所以你必须单独强制每个成员。> 在使用泛型编程时,这是一个常见的误解。在使用泛型编程时,这里有两个具体类型GenericTest1
和GenericTest1
没有关系。唯一的共同点是它们都是对象的子类类型GenericTest1
和GenericTest1
没有关系。唯一的共同点是两者都是对象的子类GenericTest和GenericTest这两个类不兼容赋值。您甚至不能强制转换它们。但是,如果您不介意复制对象,可以执行以下操作:
向类中添加副本构造函数:
public GenericTest1(GenericTest1<? extends T> other) {
this.t = other.t;
}
public-GenericTest1(GenericTest1GenericTest和GenericTest这两个类的赋值不兼容。您甚至不能强制转换它们。但是,如果您不介意复制对象,可以执行以下操作:
向类中添加副本构造函数:
public GenericTest1(GenericTest1<? extends T> other) {
this.t = other.t;
}
public-GenericTest1(GenericTest1GenericTest1
和GenericTest1
不兼容,不能在它们之间强制转换!但是如果不想公开整数,可以使用绑定:
GenericTest1<? extends Number> r = g;
GenericTest1
和GenericTest1
不兼容,不能在它们之间进行强制转换!但是如果不想公开整数,可以使用绑定:
GenericTest1<? extends Number> r = g;
首先,我将限制类中可接受的类型,并介绍将字段与Number
或其他GenericNumber
进行比较的方法,并定义您的类
public class GenericNumber<T extends Number> {
private T number;
public T getNumber() {
return number;
}
public void setNumber(T number) {
this.number = number;
}
public void setNumber(T number) {
this.number = number;
}
//constructors
public int compareTo(Number n) throws Exception {
if((number == null) || (n == null))
throw new Exception("Can't compare null values");
else if(number.doubleValue() > n.doubleValue)
return 1;
else if(number.doubleValue() == n.doubleValue)
return 0;
else
return 1;
}
public int compareTo(GenericNumber n) throws Exception {
if(n == null)
throw new Exception("Can't compare null values");
return compateTo(n.getNumber());
}
}
如您所见,最后一行将导致错误,因此需要谨慎使用泛型
顺便说一下,关于Sun now Oracle站点的泛型教程部分值得一看,即:
和/或
.首先,我将限制类中可接受的类型,并介绍将字段与Number
或其他GenericNumber
进行比较的方法,并定义您的泛型类,如
public class GenericNumber<T extends Number> {
private T number;
public T getNumber() {
return number;
}
public void setNumber(T number) {
this.number = number;
}
public void setNumber(T number) {
this.number = number;
}
//constructors
public int compareTo(Number n) throws Exception {
if((number == null) || (n == null))
throw new Exception("Can't compare null values");
else if(number.doubleValue() > n.doubleValue)
return 1;
else if(number.doubleValue() == n.doubleValue)
return 0;
else
return 1;
}
public int compareTo(GenericNumber n) throws Exception {
if(n == null)
throw new Exception("Can't compare null values");
return compateTo(n.getNumber());
}
}
如您所见,最后一行将导致错误,因此需要谨慎使用泛型
顺便说一下,关于Sun now Oracle站点的泛型教程部分值得一看,即:
和/或
.Typecast itGenericTest1 r=(GenericTest1)g;
@shashashankakadene类型转换无法工作-它仍然无法编译。Typecast itGenericTest1 r=(GenericTest1)g;
@ShashankKadne类型转换无法工作-它仍然无法编译。通过这样做,我得到了编译错误:类型不匹配:无法从GenericTest1转换为GenericTest1您使用哪个Java版本?Java 6或7没有问题。我再也没有Java 5了。通过这样做,我得到了编译错误:类型不匹配:无法从Ge转换nericTest1到GenericTest1您使用哪个Java版本?Java 6或7没有问题。我已经没有Java 5了。