Java中的泛型类型和对象

Java中的泛型类型和对象,java,object,generics,polymorphism,Java,Object,Generics,Polymorphism,我刚刚了解到Java中的泛型类型存在问题。 如果我想编写一个使用泛型类的方法,就会出现这个问题。 使用类型的显式规范,我将失去泛型类为我提供的灵活性。我也不能将Object用于方法中的泛型数据类型。但为什么不呢?对象是Java中每个类的基本类,并且这种语言具有多态性,那么为什么这不起作用呢 用自己的例子来说明: Triplet.java Main.java 错误消息 在静态方法中添加泛型参数,替换类型变量的对象: public class Triplet <T> { publ

我刚刚了解到Java中的泛型类型存在问题。 如果我想编写一个使用泛型类的方法,就会出现这个问题。 使用类型的显式规范,我将失去泛型类为我提供的灵活性。我也不能将Object用于方法中的泛型数据类型。但为什么不呢?对象是Java中每个类的基本类,并且这种语言具有多态性,那么为什么这不起作用呢

用自己的例子来说明:

Triplet.java

Main.java

错误消息


在静态方法中添加泛型参数,替换类型变量的对象:

public class Triplet <T> {
    public T a, b, c;

    Triplet(T a, T b, T c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public static void main(String[] args) {
        Triplet<String> triplet = new Triplet<String>("Hello", "Guten Tag", "Bonjour");
        printPartsOfTriplet(triplet);
    }

    static void printPartsOfTriplet(Triplet<?> triplet) {
       System.out.println(triplet.a);
       System.out.println(triplet.b);
       System.out.println(triplet.c);
    }



}
}

或有效变体:

static <A> void printPartsOfTriplet(Triplet<A> triplet) {
    System.out.println(triplet.a);
    System.out.println(triplet.b);
    System.out.println(triplet.c);
}
这里是static void printPartsOfTripletTriplet三元组,你说给我任何三元组,它意味着一个a型的三元组还没有给出,我会打印它的值

这里是静态void printPartsOfTripletTriplet你说的给我一个三元组一个类型为Object的三元组一个固定类型,我会打印它的值,每个值都是一个对象。
但是对象类型不是==字符串类型,因此,这会给您一个错误

在方法static中也添加一个泛型参数,替换类型变量的对象:

public class Triplet <T> {
    public T a, b, c;

    Triplet(T a, T b, T c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public static void main(String[] args) {
        Triplet<String> triplet = new Triplet<String>("Hello", "Guten Tag", "Bonjour");
        printPartsOfTriplet(triplet);
    }

    static void printPartsOfTriplet(Triplet<?> triplet) {
       System.out.println(triplet.a);
       System.out.println(triplet.b);
       System.out.println(triplet.c);
    }



}
}

或有效变体:

static <A> void printPartsOfTriplet(Triplet<A> triplet) {
    System.out.println(triplet.a);
    System.out.println(triplet.b);
    System.out.println(triplet.c);
}
这里是static void printPartsOfTripletTriplet三元组,你说给我任何三元组,它意味着一个a型的三元组还没有给出,我会打印它的值

这里是静态void printPartsOfTripletTriplet你说的给我一个三元组一个类型为Object的三元组一个固定类型,我会打印它的值,每个值都是一个对象。
但是对象类型不是==字符串类型,因此,这会给您一个错误,您需要使用通配符

static void printPartsOfTriplet(Triplet<?> triplet) {
    System.out.println(triplet.a);
    System.out.println(triplet.b);
    System.out.println(triplet.c);
}
这里有一个非常简单的规则,变量的类型 声明必须与传递给实际对象类型的类型匹配


您需要使用通配符

static void printPartsOfTriplet(Triplet<?> triplet) {
    System.out.println(triplet.a);
    System.out.println(triplet.b);
    System.out.println(triplet.c);
}
这里有一个非常简单的规则,变量的类型 声明必须与传递给实际对象类型的类型匹配


只是为了对达米安的答案有所贡献

可能应该替换名为printPartsOfTriplet的方法以保留在Triplet类中,然后应该使用相同的泛型类型T来打印它


在重大情况下,信息所有者应负责处理

只是为了对达米安的答案有所贡献

可能应该替换名为printPartsOfTriplet的方法以保留在Triplet类中,然后应该使用相同的泛型类型T来打印它


在重大情况下,信息所有者应负责处理

让我们说它成功了。当printPartsOfTriplet方法决定将triplet.a设置为非字符串对象时会发生什么?这是三胞胎,所以这是允许的。但是在方法完成之后,Main仍然有一个对它的引用,并且认为它是一个三元组。所以,它可以做String x=triplet.a;-但是,哎呀,这实际上不是一个字符串。让我们假设它起作用了。当printPartsOfTriplet方法决定将triplet.a设置为非字符串对象时会发生什么?这是三胞胎,所以这是允许的。但是在方法完成之后,Main仍然有一个对它的引用,并且认为它是一个三元组。所以,它可以做String x=triplet.a;-但糟糕的是,这实际上不是一个字符串。你不需要类型变量:Triplet就足够了。@AndyTurner非常感谢你的评论,我编辑了答案并添加了它。你不需要类型变量:Triplet就足够了。@AndyTurner非常感谢你的评论,我编辑了答案并添加了它。没关系,Sandro!谢谢,没关系,桑德罗!如果你想查看我的答案,感谢卡也是一个不错的选择。我会投票;我在你回答之前写了这篇文章,我的朋友,你的回答非常详细!好:如果你想查看我的答案,升级卡也是一个不错的选择。我会投票;我在你回答之前写了这篇文章,我的朋友,你的回答非常详细!好:起来