In Java, can I use a primitive type literal or type variable in an instanceof expression?

后端 未结 4 1784
后悔当初
后悔当初 2021-01-07 03:11

Can I use a primitive type literal or type variable in an instanceof expression?

class MyClass {
    {
         boolean b1 = null insta         


        
相关标签:
4条回答
  • 2021-01-07 03:46
    1. You can't do it.
    2. Even if you could, you can't use it.

    A typical usage of instanceof looks like

    void somemethod(Collection c) {
        if (c instanceof List) {...}
    }
    
    somemethod(new ArrayList());
    

    The important thing here is that you get an object of a supertype (here: Collection) which may or may not be instance of a subtype (here: List). With primitives this is impossible:

    void anothermethod(double x) {
        .... // <------ X
    }
    
    anothermethod(42);
    

    At the point X there's a variable x of type double, there's no hidden information about some int 42. The actual parameter 42 didn't masquerade as double, it's got converted to a double. That's why instanceof makes no sense for primitives.

    0 讨论(0)
  • 2021-01-07 03:50

    Nope, because of type erasure. An instance of MyClass<T> doesn't actually know what T is.

    You need to have an instance of Class<T>. Then you can use the isInstance method. One way of doing that is to specify it in the constructor:

    class MyClass<T>
    {
        private Class<T> clazz;
    
        MyClass(Class<T> clazz)
        {
            this.clazz = clazz;
        }
    
        // Now you can use clazz to check for instances, create new instances ect.
    }
    

    For the second one, the problem is the first operand, not the second. The primitive value itself isn't an instance of Integer; the boxed version is:

    Object obj = 2;
    boolean b2 = obj instanceof Integer;
    

    Whenever you've got a genuine primitive value, you'll already know the type so making a dynamic type check doesn't make much sense.

    0 讨论(0)
  • 2021-01-07 04:07
    1. Due to type erasure, you cannot know what T is.

    2. Literals (except for string literals) aren't objects.
      Therefore, no.

    0 讨论(0)
  • 2021-01-07 04:12

    Basically, instanceof askes for an object as left operand. Primitive variables are not objects, so no, you can't use it that way.

    0 讨论(0)
提交回复
热议问题