Generics in Java, using wildcards

前端 未结 2 532
梦毁少年i
梦毁少年i 2021-01-06 07:02

I have a question about Generics in Java, namely using wildcards. I have an example class GenClass like this:

public class GenClass {

    private E         


        
相关标签:
2条回答
  • 2021-01-06 07:28

    This exact situation is covered in the Java Generics Tutorial.

    Notice that [with the wildcard], we can still read elements from [the generic Collection] and give them type Object. This is always safe, since whatever the actual type of the collection, it does contain objects. It isn't safe to add arbitrary objects to it however:

    Collection<?> c = new ArrayList<String>();
    c.add(new Object()); // Compile time error
    

    Since we don't know what the element type of c stands for, we cannot add objects to it. The add() method takes arguments of type E, the element type of the collection. When the actual type parameter is ?, it stands for some unknown type. Any parameter we pass to add would have to be a subtype of this unknown type. Since we don't know what type that is, we cannot pass anything in. The sole exception is null, which is a member of every type.

    (emphasis mine)

    0 讨论(0)
  • 2021-01-06 07:38

    mmyers has the correct answer, but I just wanted to comment on this part of your question (which sounds like your rationale for wanting to use the wildcard):

    I thought that the way I have used the wildcard, makes the reference variable c be of type GenClass, which would accept as parameter any class - on the place of E I would have any class. This is just the declaration of the variable. Then I initialize it with

    If you really want to accomplish this, you could do something like without compilation errors:

    GenClass<Object> gc = new GenClass<Object>();
    gc.setVar(new ExampleClass());
    

    But then again, if you want to declare an instance of GenClass that can contain any type, I'm not sure why you'd want to use generics at all - you could just use the raw class:

    GenClass raw = new GenClass();
    raw.setVar(new ExampleClass());
    raw.setVar("this runs ok");
    
    0 讨论(0)
提交回复
热议问题