版本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无法解析为类型”Map<String,T> map
public Test(Map<String,T> map){}
那么,我该如何解决这个问题?
答案 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
}
}