如何解决Java中的r=g编译问题?

如何解决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()

对于以下泛型类,行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() {
        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(GenericTest1
GenericTest1
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 it
GenericTest1 r=(GenericTest1)g;
@shashashankakadene类型转换无法工作-它仍然无法编译。Typecast it
GenericTest1 r=(GenericTest1)g;
@ShashankKadne类型转换无法工作-它仍然无法编译。通过这样做,我得到了编译错误:类型不匹配:无法从GenericTest1转换为GenericTest1您使用哪个Java版本?Java 6或7没有问题。我再也没有Java 5了。通过这样做,我得到了编译错误:类型不匹配:无法从Ge转换nericTest1到GenericTest1您使用哪个Java版本?Java 6或7没有问题。我已经没有Java 5了。