Java中的通用类型和对象

时间:2017-11-16 17:11:48

标签: java object generics polymorphism

我刚刚了解到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

3 个答案:

答案 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来打印它。

信息的所有者应处理重大案件的处理。

相关问题