对于java,如何确保内部接口和外部接口具有相同的泛型类型?

时间:2011-02-16 07:53:59

标签: java generics interface

版本1

public interface Outer<T>{
    public interface Inner<T>{
        T get();
        void set(T t);
    }
}

虽然相同的泛型类型语法,但这两种类型完全独立。

版本2

public interface Outer<T>{
    public interface Inner<V extends T>{
        V get();
        void set(V t);
    }
}

出错:“无法对非静态类型T”进行静态引用

版本3

public interface Outer<T>{
    public interface Inner{
       <T> T get();
       <T> void set(T m);
    }
}

不确定这是否是我想要的,但似乎很好(在eclipse中没有错误),所以我尝试实现它:

public Test implements interface Outer.Inner {
       //no problem in these two
       <T> T get(){..};
       <T> void set(T m){...};

        //Errors come up here:
       Map<String,T> map;
       public Test(Map<String,T> map){
            this.map=map
       }

}

出现错误:

中的“T无法解析为类型”
  1. 声明Map<String,T> map
  2. 构造函数参数public Test(Map<String,T> map){}
  3. 那么,我该如何解决这个问题?

4 个答案:

答案 0 :(得分:4)

首先,没有办法做到这一点,因为外部接口只不过是内部接口的“命名空间”。他们真的没有任何关系。

这引出了一个问题:为什么你需要对事物进行这样的控制?如果在实现接口的类中,确定使用相同类型是有意义的,那么对于该类将是如此。但另一种实施可以而且应该被允许选择其他方式。这尤其正确,因为实现Outer的类和实现Inner的类不限于彼此嵌套。

答案 1 :(得分:3)

问题的根源是这个;内部接口是静态的,因此它与外部接口的任何实例都没有关系。因此你无法使用,外部接口泛型类型为内部接口..

根据JLS;

  

9.5会员类型声明
  接口可能包含成员类型   声明(第8.5节)。会员类型   接口中的声明是   隐式静态和公共

答案 2 :(得分:1)

如果类型必须绝对强制执行,你应该做的可能是Inner extends Outer,当然,你必须实现Inner和Outer的方法。我不确定你想要这个。

interface Outer<T> {
  interface Inner<T> extends Outer<T> {
    T myMethod(T t);
  }
}

没有其他方法可以强制执行您想要的操作。原因是界面总是静态。此外,您并不真正需要/需要此行为:界面已经足够灵活。只要知道你可以控制它的位置,世界将是你的!

答案 3 :(得分:0)

实现错误 - 您忘记添加泛型类型,这应该有帮助:

public class Test<T> implements interface Outer<T>.Inner {

   T get(){..};
   void set(T m){...};

    //Errors come up here:
   Map<String,T> map;
   public Test(Map<String,T> map){
        this.map=map
   }

}