Java中的泛型类型和对象
我刚刚了解到Java中的泛型类型存在问题。 如果我想编写一个使用泛型类的方法,就会出现这个问题。 使用类型的显式规范,我将失去泛型类为我提供的灵活性。我也不能将Object用于方法中的泛型数据类型。但为什么不呢?对象是Java中每个类的基本类,并且这种语言具有多态性,那么为什么这不起作用呢 用自己的例子来说明: Triplet.java Main.java 错误消息Java中的泛型类型和对象,java,object,generics,polymorphism,Java,Object,Generics,Polymorphism,我刚刚了解到Java中的泛型类型存在问题。 如果我想编写一个使用泛型类的方法,就会出现这个问题。 使用类型的显式规范,我将失去泛型类为我提供的灵活性。我也不能将Object用于方法中的泛型数据类型。但为什么不呢?对象是Java中每个类的基本类,并且这种语言具有多态性,那么为什么这不起作用呢 用自己的例子来说明: Triplet.java Main.java 错误消息 在静态方法中添加泛型参数,替换类型变量的对象: public class Triplet <T> { publ
在静态方法中添加泛型参数,替换类型变量的对象:
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!谢谢,没关系,桑德罗!如果你想查看我的答案,感谢卡也是一个不错的选择。我会投票;我在你回答之前写了这篇文章,我的朋友,你的回答非常详细!好:如果你想查看我的答案,升级卡也是一个不错的选择。我会投票;我在你回答之前写了这篇文章,我的朋友,你的回答非常详细!好:起来