【问题标题】:Passing "Class.class" to a function? [duplicate]将“Class.class”传递给函数? [复制]
【发布时间】:2012-03-18 19:28:53
【问题描述】:

可能重复:
Passing a class (“Country.class”) as an argument in Java

我正在尝试为 Amazon Web Service 的 DynamoDB 编写一个通用的保存函数。

目前我有:

public void save(????? classType, AmazonDynamoDBItem item)
{
    try
    {
        DynamoDBMapper mapper = new DynamoDBMapper(_dynamoDB);
        ????? object = mapper.load(classType, item.getKey());
        mapper.save(object);
    }
    ...
}

我不太确定如何制作可以接受(例如)String.class 之类的签名。

我需要在????? 中添加什么才能使此功能起作用?

【问题讨论】:

  • 那么,javadoc 说 String.getClass() 返回什么?
  • Class类应该是这样的: public void save(Class classType, AmazonDynamoDBItem item){ Class object = mapper.load(classType, item.getKey()); }

标签: java amazon-web-services


【解决方案1】:

试试这样的:

public static <E> void save(Class<E> classType)
{
    try {
        E object = classType.newInstance();
        System.out.println(object.getClass());
    }
    catch (Exception e) {
    }
}

【讨论】:

    【解决方案2】:

    classType 参数必须是 Class&lt;?&gt; 类型,即任何 Class 对象。

    【讨论】:

    • 在函数内部创建该类型的类的语法是什么? classType variable = new classType(); 不起作用。
    • 如果你想自己创建一个新的实例,那么@AKJ的回答是正确的。
    【解决方案3】:

    我正在尝试编写一个通用的保存函数

    然后使用Generics

    泛型函数允许您将类型作为“参数”传递,但它不会出现在参数列表中。在你的情况下,你想要这样的东西:

    // The "T" is the type you want to pass
    public <T> void save(AmazonDynamoDBItem item)
    {
        try
        {
            DynamoDBMapper mapper = new DynamoDBMapper(_dynamoDB);
            T object = mapper.load<T>(item.getKey());
            mapper.save(object);
        }
        ...
    }
    

    您的load 函数必须进行类似的编程以接受泛型类型。

    【讨论】:

    • 错了。通用类型信息在运行时被删除。在您的示例中,classType 是什么?您必须将类传递给 mapper.load 方法,并且由于您无法在运行时获取类型参数,因此需要 Class 对象。
    • 那我误解了他的问题。我不熟悉 AWS,我认为 DynamoDBMapper 是他创建的一个类,他可以在编译时定义其行为。如果没有这些知识,我想他会在编译后需要一个类型参数很奇怪。
    猜你喜欢
    • 1970-01-01
    • 2020-12-15
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多