繁体   English   中英

泛型类的内部类的问题

[英]issue with inner class of generic type

下面的代码无法编译最后一行,即使第二个最后一行编译好,而差异只是在似乎在其范围内的泛型类型。

谁有人解释一下? 我想这与擦除有关,但为什么倒数第二个语句编译好?

public class Main {
    public static class A {
        public class Inner {
        }
    }

    public static class B extends A {
        public class Inner {
        }
    }

    public static class Wrap<T extends A> {
        public Class<T.Inner> get(Class<T.Inner> cls) {
            return cls;
        }
    }

    public static void main(String... args) {
        Wrap<A> wa = new Wrap<>();
        Wrap<B> wb = new Wrap<>();
        // this compiles OK
        Class<A.Inner> ai = wa.get(A.Inner.class);
        // this fails
        Class<B.Inner> bi = wb.get(B.Inner.class);
    }
}

编译器错误:

 /tmp$ javac -Xdiags:verbose Main.java
Main.java:24: error: method get in class Wrap<T> cannot be applied to given types;
        Class<B.Inner> bi = wb.get(B.Inner.class);
                              ^
  required: Class<Main.B.Inner>
  found: Class<Main.B.Inner>
  reason: argument mismatch; Class<Main.B.Inner> cannot be converted to Class<Main.B.Inner>
  where T is a type-variable:
    T extends Main.A declared in class Wrap
1 error

我无法解释java的required / found语句,但是当定义TT extends AT.Inner变为A.Inner

有多种可能的变化使它工作:

  • B删除Inner
  • Inner B定义为extends A.Inner并将get方法更改为public <C extends T.Inner> Class<C> get(Class<C> cls) (使用Eclipse编译器工作,使用JDK的javac不起作用)
  • B Inner定义为extends A.Inner并将get方法更改为public <C extends A.Inner> Class<C> get(Class<C> cls)

应该如何更改取决于您希望使用此类构造实现的目标。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM