Is it possible to specify both upper and lower bound constraints on type parameters in Java?

后端 未结 3 602
南旧
南旧 2020-12-09 10:12

Is it possible to specify both upper and lower bound constraints on type parameters in Java?

I found a conversation in Sun\'s forum in which this issue was discussed

相关标签:
3条回答
  • 2020-12-09 10:41

    I don't believe so - as far as I can tell from the language specification, "super" is only valid for wildcard types in the first place. The syntax for wildcards also suggests you can only have one wildcard bound, too - so you can't use something like this either:

    // Invalid
    void foo(List<? extends Foo super Bar> list)
    

    Even though both of these are okay:

    // Valid
    void foo(List<? extends Foo> list)
    
    // Valid
    void foo(List<? super Bar> list)
    

    As noted in comments, it's possible to have multiple upper bounds - but only for type parameters and cast expressions. For example:

    // Valid
    <T extends Number & Comparable> void foo(List<T> list)
    
    0 讨论(0)
  • 2020-12-09 10:41

    From Oracle's tutorial:

    Note: You can specify an upper bound for a wildcard, or you can specify a lower bound, but you cannot specify both.

    0 讨论(0)
  • 2020-12-09 10:47

    you can't specify both at the same time but you can achieve like given code.

    class Family<F> {
        F f;
    
        public void setF(F f) {
            this.f = f;
        }
    }
    
    class GrandParent {
    }
    
    class Parent extends GrandParent {
    }
    
    class Child extends Parent {
    }
    
    private <T extends Parent> void foo(Family<? super T> list) {
        list = new Family<Parent>(); // Allows
        list = new Family<GrandParent>(); // Allows
        list = new Family<Child>(); // Not Allows
    
        list.setF(new GrandParent()); // Not Allows
        list.setF(new Parent()); // Not Allows
        list.setF(new Child()); // Not Allows
    }
    
    public void bar() {
        foo(new Family<GrandParent>()); // Allows
        foo(new Family<Parent>()); // Allows
        foo(new Family<Child>()); // Allows
    }
    
    0 讨论(0)
提交回复
热议问题