Java 为什么可以';静态引用一个内部类';泛型类上的静态方法?
请通读整个问题,以便有完整的想法 首先让classJava 为什么可以';静态引用一个内部类';泛型类上的静态方法?,java,generics,static,inner-classes,Java,Generics,Static,Inner Classes,请通读整个问题,以便有完整的想法 首先让class框如下所示:- public class Box <T>{ private T t; public void set(T t){ this.t = t; System.out.println("value:\n"); System.out.printf("%s", t.toString()); } public T get() {
框
如下所示:-
public class Box <T>{
private T t;
public void set(T t){
this.t = t;
System.out.println("value:\n");
System.out.printf("%s", t.toString());
}
public T get() {
return t;
}
static int retInt(){
return 5;
}
public <U extends Number> void inspect(U u){
System.out.println("T: " + t.getClass().getName());
System.out.println("U: " + u.getClass().getName());
}
}
上面的代码编译和执行得很好,我的不适之处在于:
如果我们向方法添加static
修饰符
public <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) -------(1)
// called in method main1()
感谢您的帮助。原因是Util类上的type参数,而内部类对是非静态的。因为Pair是一个非静态的内部类,所以它可以使用Util的T-type参数(即使在本例中它没有)。因此,当使用Pair时,有必要指定一个T,或者在Util实例的上下文中访问它(其中T是隐式可用的),或者通过特定的
Util
来限定它,例如Util.Pair
。另一种考虑方式是Pair的类型取决于Util的type参数,并且Util.Pair
与Util.Pair
不兼容
要将类型参数T保留在Util上,并将Pair保留为非静态内部类,可以更改compare To的签名
public static <T, K, V> boolean compare(Util<T>.Pair<K, V> p1, Util<T>.Pair<K, V> p2)
公共静态布尔比较(Util.Pair p1,Util.Pair p2)
或
公共静态布尔比较(Util.Pair p1,Util.Pair p2)
这是可能的,因为T的实例化与方法体无关
另外,由于Pair不引用Util内部的任何内容(非静态),所以可以将Pair的定义更改为
public static class Pair <K, V> { /* ... */ }
公共静态类对{/*…*/}
最后,为了完整起见,如果Util没有类型参数,那么
public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2)
公共静态布尔比较(对p1,对p2)
及
公共类对{/*…*/}
很好。,谢谢你,伙计。我相信你几乎涵盖了所有部分。我有一种解决问题的方法,但你给出的保持类型参数T为on的第一个解释部分消除了我的疑虑。但我仍然无法理解编译器为什么不使用静态修饰符。所以,您说过quote对必须在有特定T可用unquote的上下文中使用。正如我在我的问题中所说的(我相信,我可能错了),在创建Pair类的对象时,T信息是可用的(这里的方法main1()是非静态的)。正如我前面所说的,调用方法main1()需要参数(值)来键入参数,所以Pair类的对象将自动具有T的值,类对的哪个对象可以使用(即使在这里它们不使用)。所以,请在这里解释一下这个问题,这样我的困惑就消除了。@zeal你是对的,这有点不清楚,我改变了答案的那句话。希望它现在更有意义。我还添加了一些关于以前缺少的通用通配符的注释。感谢Geoff,编辑(通配符的使用)确实有助于消除疑云,甚至有助于Util的使用。对于前缀对,现在有意义了。再次非常感谢你。
public <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2)
public static <T, K, V> boolean compare(Util<T>.Pair<K, V> p1, Util<T>.Pair<K, V> p2)
public static <K,V> boolean compare(Util<?>.Pair<K,V> p1, Util<?>.Pair<K,V> p2)
public static class Pair <K, V> { /* ... */ }
public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2)
public class Pair<K, V> { /* ... */ }