Java 泛型 - 原始类型与非泛型有何不同
Java Generics - How is a raw type different from a non generic type
在 java 泛型上下文中,原始类型是泛型类型的非参数化调用。他们还说任何非泛型类型都不是原始类型。
我的困惑是,为什么他们说非泛型类型不是原始类型?它与泛型类型的非参数化调用有何不同。考虑以下两种情况。
案例 1:
class A<T>{
}
A a = new A(); //Raw type
案例二:
class A{
}
A a = new A();//Non-generic type
如果变量 "a" 在两种情况下的行为相同,为什么他们说 case[1] 是原始类型而 case[2] 不是?
原始类型的概念仅与泛型类型相关,因为原始类型被认为与泛型类型是赋值兼容的,但进行此类赋值会在类型安全方面打开一个漏洞,否则将保证泛型。例如,考虑一个方法 void workWith(A<Integer> a)
。您将被允许传入您的 a
变量,从而导致类型安全事故。
由于非泛型类型不会遇到此类问题,因此它们未被命名为 "raw types"。
如JLS
所述:
A non-generic class or interface type is not a raw type.
您可以在语法 级别中感受到差异:
如果我们已经参数化class:
class A<X> {
class B<Y> {
Y y;
}
}
那么只有 A
名称类型或 B
名称类型不是 non-generic
类型,它们是 raw
类型,这会影响您如何访问他们:
所有这些构造都会导致编译时错误:
A<Integer>.B ab = null;
A.B<Integer> ab = null;
原始类型与泛型类型的边界和类型擦除有关。如果你有 ArrayList<? extends Shape>
那么绑定类型是 Shape 并且将是编译时的原始类型。
在 java 泛型上下文中,原始类型是泛型类型的非参数化调用。他们还说任何非泛型类型都不是原始类型。
我的困惑是,为什么他们说非泛型类型不是原始类型?它与泛型类型的非参数化调用有何不同。考虑以下两种情况。
案例 1:
class A<T>{
}
A a = new A(); //Raw type
案例二:
class A{
}
A a = new A();//Non-generic type
如果变量 "a" 在两种情况下的行为相同,为什么他们说 case[1] 是原始类型而 case[2] 不是?
原始类型的概念仅与泛型类型相关,因为原始类型被认为与泛型类型是赋值兼容的,但进行此类赋值会在类型安全方面打开一个漏洞,否则将保证泛型。例如,考虑一个方法 void workWith(A<Integer> a)
。您将被允许传入您的 a
变量,从而导致类型安全事故。
由于非泛型类型不会遇到此类问题,因此它们未被命名为 "raw types"。
如JLS
所述:
A non-generic class or interface type is not a raw type.
您可以在语法 级别中感受到差异:
如果我们已经参数化class:
class A<X> {
class B<Y> {
Y y;
}
}
那么只有 A
名称类型或 B
名称类型不是 non-generic
类型,它们是 raw
类型,这会影响您如何访问他们:
所有这些构造都会导致编译时错误:
A<Integer>.B ab = null;
A.B<Integer> ab = null;
原始类型与泛型类型的边界和类型擦除有关。如果你有 ArrayList<? extends Shape>
那么绑定类型是 Shape 并且将是编译时的原始类型。