我刚刚了解到Java中的泛型类型存在问题。 如果我想编写一个使用泛型类的方法,则会出现问题。 通过明确指定类型I,我将失去泛型类为我提供的灵活性。我也不能使用“对象”作为方法中的通用数据类型。但为什么不呢? “对象”是Java中每个类的基本类,这种语言具有多态性,为什么这不起作用呢?
自己举例说明:
Triplet.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;
}
}
Main.java
public class Main {
public static void main(String[] args) {
Triplet<String> triplet = new Triplet<>("Hello", "Guten Tag", "Bonjour");
printPartsOfTriplet(triplet);
}
static void printPartsOfTriplet(Triplet<Object> triplet) {
System.out.println(triplet.a);
System.out.println(triplet.b);
System.out.println(triplet.c);
}
}
错误消息
Main.java:4: error: incompatible types: Triplet<String> cannot be converted to Triplet<Object>
printPartsOfTriplet(triplet);
^
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
1 error
答案 0 :(得分:2)
在方法static中添加泛型参数,将Object
替换为类型变量:
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 <A> void printPartsOfTriplet(Triplet<A> triplet)
你说“给我任何Triplet<A>
,这意味着一个带有A型的三重奏(尚未给出),我会打印它的值。
这里static void printPartsOfTriplet(Triplet<Object> triplet)
你说给我一个Triplet<Object>
(一个类型为对象的三元组(固定类型),我将打印它的值(每个都是一个对象))。
但是Object类型不是== String类型,因此,这会给你一个错误
答案 1 :(得分:2)
您需要使用通配符。
static void printPartsOfTriplet(Triplet<?> triplet) {
System.out.println(triplet.a);
System.out.println(triplet.b);
System.out.println(triplet.c);
}
这里有一个非常简单的规则 - 变量的类型 声明必须与您传递给实际对象类型的类型匹配。
http://www.thejavageek.com/2013/08/27/generics-polymorphism-with-generics/
答案 2 :(得分:2)
只是为达米安的回答做出贡献。
您的方法printPartsOfTriplet应该被替换为保留在Triplet类中,然后您应该使用相同的泛型类型T来打印它。
信息的所有者应处理重大案件的处理。