Java 为什么可以';静态引用一个内部类';泛型类上的静态方法?

Java 为什么可以';静态引用一个内部类';泛型类上的静态方法?,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() {

请通读整个问题,以便有完整的想法

首先让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() {
        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> { /* ... */ }