【问题标题】:Java generics with class and nested static interface具有类和嵌套静态接口的 Java 泛型
【发布时间】:2011-07-09 20:57:27
【问题描述】:

我想在嵌套的静态接口中使用泛型类。我的目标是做这样的事情:

public class MyClass<T>{
    private MyInterface task;

    public static interface MyInterface{
        void aMethod (T item);
    }
}

但我收到错误:无法对非静态类型 T 进行静态引用。如果我做了一些更改(如下),我可以在接口内使用泛型类型,但我想避免这种方法,因为它是多余的将同一个类写 2 次:一次用于 MyClass,一次用于 MyInterface。

public class MyClass<T>{
    private MyInterface<T> task;

    public static interface MyInterface<T>{
        void aMethod (T item);
    }
}

谢谢。

编辑:我想这样做:

MyClass c = new MyClass<String> ();
c.setInterface (new MyClass.MyInterface (){
    @Override
    public void aMethod (String s){
        ...
    }
);

或

MyClass c = new MyClass<AnotherClass> ();
c.setInterface (new MyClass.MyInterface (){
    @Override
    public void aMethod (AnotherClass s){
        ...
    }
);

【问题讨论】:

  • 那你又在问什么?
  • 我想在嵌套静态接口的方法中使用 MyClass 中指定的泛型类 T。
  • 您的嵌套类可能不是泛型的,它可能有多个泛型类型。明确这一点的唯一方法是列出所有类型

标签: java class generics interface


【解决方案1】:

除了命名空间嵌套和对私有变量的访问之外,静态嵌套类或嵌套接口(顺便说一下,它始终是静态的)与其外部类(或接口)没有任何关系。

因此,在您的情况下,外部类的类型参数在嵌套接口中不可用,您应该重新定义它。 为避免混淆,我建议为此内部参数使用不同的名称。

(作为标准API中的示例,查找接口Map.Entry&lt;K,V&gt;,嵌套在接口Map&lt;K,V&gt;中,但无法访问其类型参数,需要再次声明它们。)

【讨论】:

  • 这是否强制封闭和静态嵌套类型具有相同的类型参数。例如,EnclosingClass&lt;String&gt; 应该只适用于 StaticNestedClass&lt;String&gt; 参数化类型,而不适用于 StaticNestedClass&lt;Integer&gt; 之类的任何其他类型。
  • @RavindraRanwala 如果您声明封闭类的方法以使用具有相同参数的类型,则可以。 (例如,请参阅 Map 如何使用 Map.Entry。)
【解决方案2】:

这不是多余的。使用静态接口:

MyClass.MyInterface<String> myInstance;

并且使用非静态内部类(接口始终是静态的):

MyClass<String>.MyInterface myInstance;

一个更真实的例子:

Map<String, Integer> map = ...;
for (Map.Entry<String, Integer> entry : map.entrySet()) {
    ...
}

静态方式的好处是可以导入嵌套类型,仍然可以指定类型参数:

class ClassWithAReallyLongName<T> {
    static interface Entry<T> {
    }
}

和

import my.package.ClassWithAReallyLongName.Entry;

class Foo {
    Entry<String> bar;
}

尽管人们应该谨慎使用该成语,以免混淆读者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多