繁体   English   中英

值为null的引用类型?

[英]Type of reference type with value null?

根据: http//java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html
4.5.2参考类型的变量
引用类型可以包含null引用。

当赋值为null时,是否可以检索引用类型的声明类型?

具体来说,在使用反射的方法中,我希望该方法是null安全的并且对原始声明的类型起作用(虽然我知道以下代码片段不起作用),例如:

String referenceType = null;
MyReflectionClass.reflectionMethod(referenceType);
...
public static void reflectionMethod(Object referenceType) {
   Class<?> declaredType = referenceType.getClass();
}

如果需要,我不会反对使用泛型将类型T而不是Object作为声明的参数类型。

编辑:我知道.getClass()适用于实例,而不是声明的类型。 我想知道是否可以询问引用它的声明类型 由于类层次结构是静态的,因此获取该信息应该没有问题。

编辑2:在这里,情况很清楚: Java是“通过引用传递”还是“按值传递”?
Java只是按值传递,因此即使使用了引用类型,也总是处理它,就好像传递了值(对象实例)一样(即使内部只传递了一个对象指针)。 这意味着Java实际上并没有一个知道它的类型的引用类型(至少就程序员而言),它都在值实例中。
因此,无法确定任何null值的类型。

总而言之,没有。 但是,尝试查找空引用的成员并没有多大意义,因为null意味着没有任何东西。 你可能最好只是通过抛出NullPointerException禁止null作为输入。

如果必须处理null,也许最好的方法是显式传递类引用(甚至更好,直接引用相关方法)。

public static void reflectionMethod(Object param, Class<?> referenceType) // null is dis-allowed for referenceType
{
    // ... no need to try to back-track the type from an object
}

如果你只能获得空值,那么除非有一个非常幸运的猜测,否则很难(除非有其他限制因素)。

你误会了。 getClass()不会告诉您变量的声明类型,它会告诉您对象的类型(如果有)。 让我们停下来,退后一分钟 - 你会指的是哪个变量,如果它那样做了? 原始变量? 方法参数? 它沿途经过的任何其他变量? 那将是彻底的疯狂。

您找不到声明的null引用类型。 泛型也无法真正帮助,因为它们在编译时被删除了。 如果你需要知道null情况,你必须在某种程度上在运行时传递类型。

不它不是。 在您的示例中,当尝试在空引用referenceType上调用方法时,您将获得空指针异常。

更具体地说,这是不可能的,因为在编译时不一定知道具体类型,例如,如果我声明Object类型的引用并将其分配给String,那么您的方法应该发现该对象是String而不是Object。

Object referenceType= new String("I'm a string");
MyReflectionClass.reflectionMethod(referenceType);
...
public static void reflectionMethod(Object referenceType) {
   Class<?> declaredType = referenceType.getClass(); // returns String.class
}

我不确定这在您的上下文中是否有用,但您可以使用泛型来实现类似的东西 - Java 1.5+保留子类的类型信息。

package spikes;

import java.lang.reflect.ParameterizedType;

public class ReflectMethod {
    public abstract static class GenericType<T> {
        public Class typedClass() {
            ParameterizedType pType = (ParameterizedType) getClass().getGenericSuperclass();
            return (Class) pType.getActualTypeArguments()[0];
        }

        public void reflectMethod(T o) {
            System.out.println("Class: " + typedClass());
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        GenericType<String> gs = new GenericType<String>() {

        };
        gs.reflectMethod("");
    }
}

暂无
暂无

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

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