繁体   English   中英

Java泛型类型

[英]Java generics type

考虑下面的代码...

public class Test {

    public interface I {}
    public enum E1 implements I {M, N}
    public enum E2 implements I {O, P}
    public static class A<T extends Enum<T> & I> {
        void test() {
            // how to print the enum constants here ?
            System.out.println("... ");
        }
    }

    public static class B extends A<E2> {}

    public static void main(final String[] args) {
        A<E1> a = new A<E1>();
        B b = new B();

        a.test();
        b.test();
    }
}

如何在test访问T类? 例如,如何打印枚举常量?

不幸的是,情况A的那些一般信息在运行时不可用。 您必须使用类型标记模式。 如果是B,则可以使用“ hack”来获取常量:

    void test() {
        Type superclass = this.getClass().getGenericSuperclass();
        if (ParameterizedType.class.isAssignableFrom(superclass.getClass())) {
            ParameterizedType genericSuperclass = (ParameterizedType) superclass;
            Class enumClass = (Class) genericSuperclass.getActualTypeArguments()[0];
            for (Object o : enumClass.getEnumConstants()) {
                System.out.println(o);
            }
        }
    }

考虑如何在不使用泛型的情况下编写程序很有帮助。 可以通过泛型编写的任何程序也可以通过简单地删除类型参数并在适当的位置插入强制类型转换而变成没有泛型的等效程序。 (忽略了一些类的元数据中的泛型之类的东西,在这里不相关。)这称为类型擦除

public class Test {

    public interface I {}
    public enum E1 implements I {M, N}
    public enum E2 implements I {O, P}
    public static class A {
        void test() {
            // how to print the enum constants here ?
            System.out.println("... ");
        }
    }

    public static class B extends A {}

    public static void main(final String[] args) {
        A a = new A();
        B b = new B();

        a.test();
        b.test();
    }
}

如果没有泛型就无法编写程序,那么也不能使用泛型来编写程序。

是否有理由创建类型参数化类型,然后不使用参数化类型? 使用参数化类型并查看java.lang.Class的javadoc,它很容易实现,这是一种实现方法。

public class Test {

    public interface I { }
    public enum E1 implements I {M, N}
    public enum E2 implements I {O, P}
    public static class A<T extends Enum<T> & I> {
        void test(Class<T> ct) {
            for(T t: ct.getEnumConstants()) {
                System.out.println("... " + t);
            }
        }
    }

    public static class B extends A<E2> {}

    public static void main(final String[] args) {
        A<E1> a = new A<E1>();
        B b = new B();

        System.out.println("Using E1");
        a.test(E1.class);
        System.out.println("Using E2");
        b.test(E2.class);
    }
}

产量

Using E1
... M
... N
Using E2
... O
... P

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM