如何使用Java中的泛型引用嵌套类型?

前端之家收集整理的这篇文章主要介绍了如何使用Java中的泛型引用嵌套类型?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何创建引用嵌套泛型类型的泛型类?

我正在尝试创建一个比较器类,可以比较B的内部类型,而不需要公开这些类型.在下面的例子中,我得到一个编译器警告,用于将我的T内嵌值传递给Comparable:@H_301_3@

public class SSCCE {

    // Compare my A instances.
    class AComparator<T extends B> implements Comparator<T> {

        @Override
        public int compare(final T o1,final T o2) {
            return o1.getValue().compareTo(o2.getValue());
        }
    }


    class A extends B<Integer> {
        @Override Integer getValue() { return 1; }
    }

    class A2 extends B<String> {
        @Override String getValue() { return "Test String!"; }
    }

    abstract class B<T extends Comparable<T>> {
        abstract T getValue();
    }

    public static void main(String[] args) {
        SSCCE sscce = new SSCCE();
        AComparator<A> comparator = sscce.new AComparator<>();
        comparator.compare(sscce.new A(),sscce.new A());
    }
}

是否可以表示使用内部值来安全地允许投射?@H_301_3@

我试过的事情@H_301_3@

>创建可比较的通配符(不可编译):@H_301_3@

class AComparator2<T extends B<? extends Comparable<?>>> implements Comparator<T> {

    @Override
    public int compare(final T o1,final T o2) {
        Comparable<?> o1value = (Comparable) o1.getValue();
        Comparable<?> o2value = (Comparable) o2.getValue();
        return o1value.compareTo(o2value);
    }
}

>声明一个辅助泛型参数类型(U),这简单地推迟了问题:@H_301_3@

class AComparator3<T extends B<U>,U extends Comparable<U>> implements Comparator<T> {

    @Override
    public int compare(final T o1,final T o2) {
        U o1value = o1.getValue();
        U o2value = o2.getValue();
        return o1value.compareTo(o2value);
    }
}
...
AComparator3<A,Comparable<U>> comparator = sscce.new AComparator3();

该比较器不是比较类A的两个实例,而是它们的内容的一部分.@H_301_3@

解决方法

通配解决方案不起作用
class AComparator2<T extends B<?>> {
        public int compare(T o1,T o2)

因为这里T太松了我们不能确定两个T可以相互比较 – 可能o1是B< X1>而o2是B X2,X1,X2是两种不同的类型.@H_301_3@

您的第三个解决方案将T限制在特定的B< U>@H_301_3@

class AComparator3<T extends B<U>,U extends Comparable<U>>

这完美地工作除了使用网站必须指定U,即使U可以从T推导出来@H_301_3@

AComparator3<A,Integer>  
                    ^^^^^^^ duh!

这很讨厌在其他用例之前也有同样的问题.没有好的答案.@H_301_3@

幸运的是,在您的情况下,U不需要在使用网站上的任何地方,因此我们可以简单地使用通配符@H_301_3@

AComparator3<A,?> comparator = sscce.new AComparator3<>();
    comparator.compare(sscce.new A(),sscce.new A());

实际上,比较器是比较器< A>,这可能是你需要的.另外我们可以创建一个方便的方法来隐藏新的丑陋.所以你可以做一些类似的事情@H_301_3@

Comparator<A> comparator = sscce.comparator();

猜你在找的Java相关文章