package generics;
public class InnerClassGenerics{
class Innerclasss{
}
public static void main(String[] args) {
InnerClassGenerics icg=new InnerClassGenerics();
Innerclasss innerclass=icg.new Innerclasss();
}
}
上面的代码是可能的,并且可以编译!!!
为什么下面的代码无法编译,并且可以对内部类进行参数化?
package generics;
public class InnerClassGenerics<T>{
class Innerclasss<T>{
}
public static void main(String[] args) {
InnerClassGenerics<String> icg=new InnerClassGenerics<>();
Innerclasss<String> innerclass=new Innerclasss<>();
}
}
在上面的代码中,如果将类设为静态,则可以正常工作!!!为什么没有static关键字是不可能的?
通常,如果外部类上没有任何泛型类型,则可以编写如下代码:
Outer outer = new Outer();
Inner inner = outer.new Inner();
因为内部类中的每个方法已经知道应该使用什么类型。
但是,当外部类使用泛型类型时,情况就复杂得多了。由于内部类可以访问其一个或多个外部类的所有成员,因此它还需要了解外部类中使用的泛型类型,以确保在操作泛型值时确保类型安全。
看一下这段代码:
class Outer<T> {
private T someValue;
class Inner {
T getOuterValue(){
return someValue;
}
void setOuterValue(T value){
someValue=value;
}
}
//rest of code
}
这意味着Inner
该类的实例还依赖于其外部类的泛型类型。这就是为什么在创建对内部类的引用时,您需要通过将外部类编写为通用类型来显式地使用外部类
Outer<String> outer = new Outer<>();
Outer<String>.Inner inner = outer.new Inner();
^^^^^^^^^^^^^
或明确地说外部类使用原始类型(不鼓励使用),例如
Outer.Inner inner = outer.new Inner();
因此,要使代码正常工作,您需要:
添加外部类类型(最好是其泛型类型)
在外部类的实例上调用内部类的构造函数(就像非静态方法不能在没有实例的情况下调用一样,非静态(内部)类必须使用外部类实例创建)
InnerClassGenerics<String>.Innerclasss<String> innerclass = icg.new Innerclasss<>();
^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^
point 1 point 2
同样,在这种情况下,您不应为嵌套类及其外部类中的泛型类型使用相同的名称
public class InnerClassGenerics<T>{
class Innerclasss<T>{
...
}
}
因为T
来自外部类的Innerclasss
皮革 (不是它会引起当前的问题,但以后可能会使您的生活变得困难)。T
InnerClassGenerics
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句