2017-06-23 56 views
0

Test test = new Test(){}; {}中没有任何内容,为什么结果不同。因为当你写这java泛型和反射,为什么不同的结果

Test test = new Test() {}; 

你指示编译器为您创建一个新的匿名类型

public class Test<T> { 
    private final TypeToken<T> typeToken = new TypeToken<T>(getClass()) {}; 
    private final Type type = typeToken.getType(); 

    public void foo() { 
     System.out.println(this.type); 
    } 

    public static void main(String[] args) { 
     Test<Integer> test = new Test<Integer>() {}; 
     Test<Integer> test2 = new Test<Integer>(); 
     test.foo();// class java.lang.Integer 
     test2.foo();//T 
    } 
} 
+1

什么结果?它有什么不同?请注意,在一种情况下,您正在创建'Test'的实例,另一种情况下您正在创建'Test'的匿名子类的实例。 –

回答

1

的结果是不同的。该类型来自Test,并且可以(但不必)覆盖其方法。

在你的情况下,类型不会覆盖任何方法,但它是不同的类型。

+0

我不明白你想用_override其methods_做什么。你能澄清吗? –

+0

@SotiriosDelimanolis OP的混淆来自于不理解在'new'表达式之后用花括号创建匿名类的语法,它不提供任何新的行为,即当花括号内没有任何新行为时。我想说明一点,通常你将方法覆盖放在这些大括号内,但Java语法允许你继承基类而不需要进一步的专门化。 – dasblinkenlight

+0

我不认为他们的混淆是关于一般匿名课程。我认为他们的混淆是关于'TypeToken'行为返回匿名类实例的类型参数和另一个类型参数'T'的行为。 –