具有类和嵌套静态接口的Java泛型

时间:2011-03-06 16:54:18

标签: java class generics interface

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

public class MyClass<T>{
    private MyInterface task;

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

但我得到错误:无法对非静态类型T进行静态引用。如果我做了一些更改(下面)我可以在接口中使用泛型类型,但我想避免使用此方法,因为它是多余的两次写同一个类:一个用于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){
        ...
    }
);

2 个答案:

答案 0 :(得分:17)

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

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

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

答案 1 :(得分:7)

这不是多余的。使用静态界面:

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;
}

虽然人们应谨慎使用这个成语,以免混淆读者。