Java通配符类型的上下限

问题描述 投票:6回答:1

我环顾四周,到目前为止,还没有看到在Java中对同一通配符类型同时设置上下限的任何方法。我不确定是否可能,并且倾向于它是Java中通配符的当前限制。

下面是我要寻找的示例。

public class A {}
public class B extends A{}
public class C extends B{}
public class D extends C{}

public static void main(String[] args)
{
    List<A> a = Arrays.asList(new A());
    List<B> b = Arrays.asList(new B());
    List<C> c = Arrays.asList(new C());
    List<D> d = Arrays.asList(new D());

    extendsParam(a); // error as A is not assignable to B
    extendsParam(b);
    extendsParam(c); 
    extendsParam(d); // 3 previous ok as they can produce B

    superParam(a);
    superParam(b);
    superParam(c); // 3 previous ok as they can consume C
    superParam(d); // error as C is not assignable to D

    extendsSuperParam(a); // error as A is not assignable to B
    extendsSuperParam(b);
    extendsSuperParam(c); // 2 previous ok as they can consume C and produce B
    extendsSuperParam(d); // error as C is not assignable to D
}

public static void extendsParam(List<? extends B> blist)
{
    B b = blist.get(0);
    blist.add(new C()); // error
}

public static void superParam(List<? super C> clist)
{
    B b = clist.get(0); // error
    clist.add(new C());
}

public static void extendsSuperParam(List<???> bclist)
{
    B b = bclist.get(0); // ok
    bclist.add(new C()); // ok
}

WildcardType.java类中查找通用类型信息,看起来它支持使用该信息定义类型。但是,我找不到用该语言创建这种类型的方法。

我是否缺少某些东西,或者这是目前无法用Java语言描述的类型?

java generics wildcard
1个回答
0
投票

根据Oracle Docs无法完成:

注意:您可以为通配符指定一个上限,也可以指定一个下限,但不能同时指定两者。

© www.soinside.com 2019 - 2024. All rights reserved.