繁体   English   中英

泛型:创建参数化的类参数

[英]Generics: Creating parameterized class argument

如何获得参数化的Class对象用作方法参数?

class A<T>
{
    public A(Class<T> c)
    {
    }

    void main()
    {
        A<String> a1 = new A<String>(String.class);     // OK
        A<List<String>> a2 = new A<List<String>>(List<String>.class);  // error
        A<List<String>> a3 = new A<List<String>>(Class<List<String>>);  // error
    }
}

您可能会问,为什么我要这样做? 我有一个参数化的类,其类型是另一个参数化的类,并且其构造函数需要该其他类的类型作为参数。 我知道运行时类没有有关其类型参数的信息,但这不应阻止我在编译时执行此操作。 看来我应该能够指定诸如List<String>.class 还有其他语法可以做到这一点吗?

这是我的实际用法案例:

public class Bunch<B>
{
    Class<B> type;

    public Bunch(Class<B> type)
    {
        this.type = type;
    }

    public static class MyBunch<M> extends Bunch<List<M>>
    {
        Class<M> individualType;

        // This constructor has redundant information.
        public MyBunch(Class<M> individualType, Class<List<M>> listType)
        {
            super(listType);
            this.individualType = individualType;
        }

        // I would prefer this constructor.
        public MyBunch(Class<M> individualType)
        {
            super( /* What do I put here? */ );
            this.individualType = individualType;
        }
    }
}

这可能吗?

只是演员呢?

super((Class<List<M>>)List.class);

类文字不具有所需的类型参数。

请记住,您不会在运行时将List作为类获得,正确的方法可能是使用BalusC告诉您的TypeToken。 没有TypeToken,您将无法转换为List,但是可以创建如下所示的内容:

public static class MyBunch2<List_M extends List<M>, M> extends Bunch<List_M>
{
    Class<M> individualType;

    @SuppressWarnings("unchecked")
        public MyBunch2(Class<M> individualType)
    {
        super((Class<List_M>) List.class);
        this.individualType = individualType;
    }
}

由于List_M extends List<M>因此这不是您所希望的类型安全,但可能还不错。 创建实例就像编写一样难看

MyBunch2<List<String>, String> a = new MyBunch2<List<String>, String>(String.class);

但您可以使用工厂方法进行改进

public static <M2> MyBunch2<List<M2>, M2> of(Class<M2> individualType){
    return new MyBunch2<List<M2>, M2>(individualType);
}

然后写

MyBunch2<List<String>, String> b = MyBunch2.of(String.class);

如果您使用的是eclipse,则代码辅助将帮助您编写丑陋的类MyBunch2,String>

当然,在运行时,this.type将是java.util.List,而不是java.util.List。要正确使用,请使用TypeToken。

---继续---

你甚至可以再上一堂课

public static class MyBunch3<M> extends MyBunch2<List<M>, M>
{
        public MyBunch3(Class<M> individualType) {
            super(individualType);
        }
}

然后创建实例为

MyBunch3<String> c = new MyBunch3<String>(String.class);

必须在一个班上做到这一点...但是我不知道

暂无
暂无

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

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