【问题标题】:Does Class<SomeObject> have only one instance?Class<SomeObject> 只有一个实例吗?
【发布时间】:2015-09-11 11:34:52
【问题描述】:

Class&lt;SomeObject&gt; 是否只有一个实例 SomeObject.class

那是一个函数

void f(Class&lt;SomeObject&gt; arg)

是否可以只传递SomeObject.class 否则编译时错误?

【问题讨论】:

    标签: java


    【解决方案1】:

    是的。

    documentation 所述:

    返回此对象的运行时类。返回的 Class 对象是 被静态同步方法锁定的对象 代表班级。

    但是对于void f(Class&lt;SomeObject&gt; arg) 方法,您可以传递void f(Class&lt;? extends SomeObject&gt; arg)。看this question

    传递Class&lt;? extends SomeObject arg 你可以这样做:

    myMethod(Class<? extends BasicObject> clazz)
    {
        if (!clazz.isInstance(CodeObject))
        {
            (do something different)
        }
        ...
    }
    

    【讨论】:

    • 谢谢!那么,定义 void f(Class arg) 因为它只接受 SomeObject.class 会没有意义吗?
    • 不! SomeObject 可以扩展,所以如果你有一个扩展的对象,你可以在方法上处理它。
    • @Alex 可能看起来没什么意义,但是在一些特殊的场景下还是很有用的。例如,如果你有类 MyClass&lt;T&gt;init(Class&lt;T&gt; clazz) 方法,然后你会从它扩展,或者类似的东西。
    【解决方案2】:

    您始终可以传递null,但除此之外,唯一有效的参数是SomeObject.class,它与包含void f(Class&lt;SomeObject&gt; clazz) 的类加载了相同的ClassLoader

    您可以拥有多个不同的 SomeObject.class 实例,但它们需要由不同的类加载器加载(否则它们将不是单独的实例,而是都引用同一个 Class 对象)。

    【讨论】:

      【解决方案3】:
      1. 也许你是这样的?

      这是SomeObject 类的符号或覆盖(语法荧光笔有问题,不接受?,

      【讨论】:

        【解决方案4】:

        每个类似乎确实只有一个对应的Class 实例,请参阅this discussion

        不幸的是,您的方法也可能被原始的Class 参数调用:)。

        Class clazz = AnotherClass.class;
        
        f(clazz); 
        

        【讨论】:

          猜你喜欢
          • 2016-06-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-09
          • 1970-01-01
          相关资源
          最近更新 更多