【问题标题】:Class reference for a Java inner classJava 内部类的类引用
【发布时间】:2012-08-17 20:20:00
【问题描述】:

有没有办法引用 any 内部类?

我想指定一个与内部类兼容的返回类型,例如

Class<OuterClass.*> some_method();

我了解此语法无效。有办法表达吗?

我知道我不能使用像 Class&lt;? extends OuterClass&gt; 这样的东西,因为内部类不会扩展外部类。

【问题讨论】:

  • 你为什么要这样做?它不会增加任何类型安全性。
  • 是的,你可以让一个内部类扩展一个外部类,不是吗?
  • 内部类只是定义位置的问题。您不妨寻求一种将类型绑定到包的方法。
  • 我的问题是,为什么 Eclipse 要求导入内部类? class OuterClass&lt;T extends InnerClass&gt;{public static class InnerClass{}},解决方法是 answer

标签: java generics inner-classes


【解决方案1】:

嗯,至少可以参考具体的内部类:

<T extends OuterClass.InnerClass> Class<T> some_method()

除此之外,通过返回一个 any 内部类的对象,你会得到什么?这相当于返回任何对象加上内部实例与外部实例具有特殊关系的事实。但是,无论如何,您可能无法直接使用该特殊关系。

编辑:

正如其他人已经指出的那样,InnerClass 可能是由其他内部类扩展的超类。这将允许您返回扩展该类的 任何 类。

如果您要使用接口,则不仅限于 inner 类,因为对于此限制,您需要非静态内部接口。但是,内部接口默认是静态的。

【讨论】:

  • 我认为只有静态内部类可用
  • @EugenMartynov 不,您也可以使用非静态内部类。
  • InnerClass 不扩展InnerClass,这不适用于OuterClass 的其他内部类,我认为即OP 想要的
  • Class&lt;OuterClass.*&gt; 表示OuterClass 的任何内部类
  • @Nandkumar 没错,但InnerClass 也可以是一个接口。关键是:不实现特殊接口或扩展另一个内部类是不可能的,这是不可能的。据我了解 OP,问题是是否可以在类本身上使用特殊标记来声明 any 内部类
【解决方案2】:

不,没有。就像您不能使用通配符引用包一样:

Class<com.example.*> some_method();
Class<com.example.?> some_method();

此类声明的用例非常有限,根本无法纳入 JLS。请注意,您也不能在泛型范围之外使用此类“位置匹配类型”。例如。你不能声明:

void some_method(OuterClass.*  argument);
void some_method(com.example.* argument);

【讨论】:

    【解决方案3】:

    我宁愿定义一个(内部)接口,让所有内部类实现它,然后:

    Class<OuterClass.MyInterface> someMethod();
    

    这将比尝试引用任何内部类更安全。当您需要另一个内部类用于其他用途时,或者您决定提取一个类时,您不会有任何问题。

    【讨论】:

    • 很遗憾,不支持内部接口。它必须是一个内部基类。
    • @Thomas “不支持内部接口”是什么意思?它们很常用,对于定义回调非常有用。
    • @dystroy 你是对的。我自己的测试示例愚弄了我,不支持内部类的内部接口。 :) - 此外,内部接口也可以由其他类实现,不再需要它们是 inner 接口。
    【解决方案4】:

    您可以定义标记接口并通过内部类实现它。

    <T implements CustomMarkerInterface> Class<T> some_method()
    

    所以这将适用于OuterClass的所有内部类

    public class Outer {
    
        public class Inner implements CustomMarkerInterface{
    
        }
    
        public class Inner1 implements CustomMarkerInterface{
    
        }
    
        public class Inner2 implements CustomMarkerInterface{
    
        }
    
    }
    

    【讨论】:

      【解决方案5】:

      Class&lt;InnerClass&gt; 在 java 中是允许的。您在寻找特定的东西吗?

      public class Client
      {
      interface InnerType
      {
      }
      public class InnerClass implements InnerType
      {
      }
      public Class<? extends Client.InnerType> test()
      {
          return InnerClass.class;
      }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2013-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-30
        • 1970-01-01
        • 1970-01-01
        • 2023-01-24
        相关资源
        最近更新 更多