1)为什么obj4,obj6,obj7会产生编译错误,而obj5可以呢?在哪里可以阅读有关使用此类通用内外部类进行调节的规则的信息?我什么都没找到。当我在obj3中不为Inner类提供任何类型参数时,这很好(虽然Inner类需要为其S类型的fld3字段提供一些东西),但是当我这样做时,并且不为Outer类提供类型-它不会编译(obj4)-尽管可能暗示有Object ...2)此外,为什么obj10可以正常编译,但是obj11失败?在obj10行中,我还编写了externalInstance.new Inner (),对于Inner而言,它暗示S是对象。但这对于内在来说不是问题,但是对于外在来说同样的“把戏”是问题。 //in Class A of package com.sth public class MyGen<T> { T fld1; class GenInner<S> { T fld2; S fld3; } // within main of Class Driver of same package com.sth MyGen.GenInner obj1 = new MyGen<String>().new GenInner<Integer>(); MyGen.GenInner obj2 = new MyGen<String>().new GenInner<>(); MyGen.GenInner obj3 = new MyGen<String>().new GenInner(); //MyGen.GenInner obj4 = new MyGen().new GenInner<String>(); //ERR ! MyGen.GenInner obj5 = new MyGen<>().new GenInner<String>(); //MyGen<String>.GenInner obj6; // ERR //MyGen.GenInner<String> obj7; // ERR MyGen<String>.GenInner<Integer> obj8; MyGen.GenInner obj9; MyGen<String>.GenInner<Integer> obj10 = new MyGen<String>().new GenInner<>(); //Type mismatch: cannot convert from MyGen<Object>.GenInner<Integer> to MyGen<String>.GenInner<Integer> //MyGen<String>.GenInner<Integer> obj11 = new MyGen<>().new GenInner<Integer>(); // ERR!这些答案与我的问题有关,但不提供任何线索:Answer 1Answer 2Answer 3Answer 4Answer 5 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 未编译的示例大部分是稀有类型的示例。 (此外,正如John在评论中指出的那样,obj3示例也不应编译。)raw type是通过使用没有伴随的类型实参列表的泛型类型(例如Set,而不是Set<Float>)形成的类型。罕见的类型是当您具有通用外部类和通用内部类,其中一个是原始的而另一个不是。取自JLS 4.8 Raw Types:  更准确地说,原始类型定义为以下之一:      通过采用通用类型声明的名称而没有随附的类型参数列表形成的引用类型。  数组类型,其元素类型为原始类型。  原始类型static的非R成员类型,该成员类型不从R的超类或超接口继承。  (请注意,粗体字表示如果您具有原始类型MyGen,则其非static成员类GenInner也必须是原始类型,因此不存在诸如MyGen.GenInner<String>之类的东西。)  上述规则的另一个含义是,原始类型的通用内部类本身只能用作原始类型:class Outer<T>{ class Inner<S> { S s; }}    不能以部分原始类型(“稀有”类型)访问Inner:Outer.Inner<Double> x = null; // illegalDouble d = x.s;    因为Outer本身是原始的,所以它的所有内部类(包括Inner)也是原始的,因此无法将任何类型参数传递给Inner。  将类型参数传递给未从其超类或超接口继承的原始类型的非static类型成员是编译时错误。    尝试将参数化类型的类型成员用作原始类型是编译时错误。    这意味着对“稀有”类型的禁止扩展到了对限定类型进行参数化的情况,但是我们尝试将内部类用作原始类型:Outer<Integer>.Inner x = null; // illegal    这与上面讨论的情况相反。这种半熟类型没有实际的理由。在旧版代码中,不使用任何类型参数。在非遗留代码中,我们应正确使用泛型类型并传递所有必需的类型参数。obj11 = new MyGen<>().new GenInner<Integer>()的示例并非罕见的类型。它看起来像是对Diamond进行类型推断的常规失败,因为表达式new MyGen<>()没有分配给任何对象。在没有分配的情况下,通常采用Object。 (更严格地说,它是类型变量的上限,在这种情况下为Object。)同样,尽管与当前问题没有直接关系,但以下是在新代码中实际应使用的仅有的两种形式:MyGen<String>.GenInner<Integer> ok1 = new MyGen<String>().new GenInner<Integer>();MyGen<String>.GenInner<Integer> ok2 = new MyGen<String>().new GenInner<>();所有其他(可编译的)都使用原始类型,不鼓励使用原始类型。关于java - 管理通用外部类及其内部通用内部类的实例化实例并声明各自引用的规则是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44853227/ (adsbygoogle = window.adsbygoogle || []).push({});
10-09 00:03