![类型变量的泛化_第1页](http://file4.renrendoc.com/view12/M08/2D/1C/wKhkGWbCMtWAUPhlAADJcpYiavw689.jpg)
![类型变量的泛化_第2页](http://file4.renrendoc.com/view12/M08/2D/1C/wKhkGWbCMtWAUPhlAADJcpYiavw6892.jpg)
![类型变量的泛化_第3页](http://file4.renrendoc.com/view12/M08/2D/1C/wKhkGWbCMtWAUPhlAADJcpYiavw6893.jpg)
![类型变量的泛化_第4页](http://file4.renrendoc.com/view12/M08/2D/1C/wKhkGWbCMtWAUPhlAADJcpYiavw6894.jpg)
![类型变量的泛化_第5页](http://file4.renrendoc.com/view12/M08/2D/1C/wKhkGWbCMtWAUPhlAADJcpYiavw6895.jpg)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1/1类型变量的泛化第一部分类型变量的一般化 2第二部分泛化类型变量的语法形式 5第三部分泛化类型变量的类型检查规则 7第四部分泛化类型变量与派生类型的关系 10第五部分泛化类型变量在类型推断中的应用 13第六部分泛化类型变量的类型转换规则 16第七部分泛化类型变量在多态编程中的意义 19第八部分泛化类型变量在高级类型系统中的应用 22
第一部分类型变量的一般化关键词关键要点【类型变量的实例化】
1.类型变量实例化是将类型变量替换为具体类型的过程。
2.实例化通常发生在函数调用或对象创建时。
3.实例化允许类型变量在不同的上下文中具有不同的含义,从而实现代码的灵活性和可重用性。
【类型推断】
类型变量的泛化
类型变量的泛化是类型理论中的一个概念,它允许类型变量被用于表示各种类型的对象。泛化使得程序员能够创建通用的代码,该代码可以处理不同类型的输入并生成不同类型的输出。
类型变量的引入
在类型理论中,类型变量是占位符,表示特定类型的未知类型。例如,在以下声明中,类型变量`T`表示未知类型:
```
funidentity(x:T):T
```
这个函数表明它可以接受和返回任何类型的输入:
```
identity(1)//返回1
identity("abc")//返回"abc"
```
类型推断
类型推断是一种技术,它允许编译器自动推导出类型变量的类型。例如,在以下代码中,编译器可以推导出`x`的类型为`int`:
```
funsum(x:int,y:int):int
```
类型约束
类型约束可以应用于类型变量以限制它们的可能类型。例如,以下声明要求类型变量`T`必须是`int`或`float`:
```
funcompare(x:T,y:T)whereT:intorfloat
```
泛型类型
泛型类型是使用类型变量定义的类型。它们允许创建通用的代码,该代码可以处理不同类型的数据。例如,以下代码是一个泛型列表类型:
```
datalist<T>
```
此类型可以表示一个包含任何类型元素的列表。例如,以下代码创建一个包含整数的泛型列表:
```
varmyList:list<int>=[1,2,3]
```
泛型函数
泛型函数是使用类型变量定义的函数。它们允许创建通用的代码,该代码可以处理不同类型的数据。例如,以下代码是一个泛型比较函数:
```
funcompare<T>(x:T,y:T):bool
```
此函数可以比较任何类型的值。例如,以下代码比较两个整数:
```
compare(1,2)//返回true
```
泛化的好处
类型变量的泛化具有许多好处,包括:
*代码重用:泛化允许程序员创建通用的代码,该代码可以处理不同类型的输入和输出。这减少了重复代码的需要并提高了代码的可重用性。
*类型安全:类型推断和类型约束确保类型变量的类型有效,提高了程序的类型安全性。
*可读性和可维护性:泛化有助于提高代码的可读性和可维护性,因为程序员可以专注于算法而不是特定类型的实现。
结论
类型变量的泛化是类型理论中一个强大的概念,它允许程序员创建通用的、类型安全的代码。泛化使得代码重用、类型安全、可读性和可维护性得到了显著的提高。第二部分泛化类型变量的语法形式关键词关键要点【类型变量的声明】
1.类型变量使用大写字母,例如`T`、`U`、`V`等。
2.泛型类型声明在类、接口或方法签名中使用尖括号<>,例如`classBox<T>`。
3.类型变量可以约束为特定类型或接口,例如`classBox<TextendsNumber>`。
【类型推断】
泛化类型变量的语法形式
泛化类型变量用于为类型参数(包括类和方法的类型参数)指定约束,以确保针对泛型类型创建的代码在类型安全的情况下工作。泛化类型变量的语法形式如下:
```
<TextendsBound1&Bound2&...&BoundN>
```
其中:
*`<T>`是泛化类型变量的名称。
*`extends`关键字指定了泛化类型变量的边界。
*`Bound1`,`Bound2`,...,`BoundN`是泛化类型变量的边界类型。
可用的类型边界
泛化类型变量的边界类型可以是以下任何类型:
*类类型:例如,`java.lang.Number`或`java.util.List`。
*接口类型:例如,`java.lang.Comparable`或`java.util.Iterator`。
*其他泛化类型变量:例如,`<TextendsComparable<T>>`。
*通配符类型:例如,`?`或`?extendsNumber`。
*其他边界类型:例如,`<TextendsNumber&Comparable>`。
使用泛化类型变量的示例
以下示例展示了如何使用泛化类型变量:
```java
//...
//...
//利用`Comparable<T>`接口对列表元素进行排序
//...
}
}
```
在这个示例中,泛化类型变量`T`受约束于`Comparable<T>`。这意味着`MyList`只能存储可与自身类型进行比较的元素。这确保了`sort()`方法可以安全地对列表元素进行排序,而无需比较不同类型元素。
泛化类型变量的优点
使用泛化类型变量提供了一些优点,包括:
*类型安全性:确保针对泛型类型创建的代码在类型安全的情况下工作。
*代码可重用性:允许创建可用于不同类型数据的可重用代码。
*代码简洁性:通过消除对类型转换和强制转换的需求,简化代码。
*可扩展性:使代码可以轻松地适应未来类型需求的变化。第三部分泛化类型变量的类型检查规则关键词关键要点类型变量的泛化类型检查规则
主题名称:类型变量的类型检查
1.类型变量可以用来表示任意类型,在泛型函数或类型中使用时,它们充当占位符。
2.类型检查器使用类型推断来确定类型变量的实际类型,过程如下:
-如果使用类型变量的地方出现类型注释,则类型变量的类型由注释指定。
-如果没有类型注释,类型检查器会推断最具体化类型,即使类型变量满足所有约束的最具体类型的变量。
3.类型检查器使用以下规则来推断类型变量的类型:
-如果类型变量用于函数参数,其类型是函数声明中指定的参数类型。
-如果类型变量用于函数返回值,其类型是函数声明中指定的返回类型。
-如果类型变量用于类成员变量,其类型是类声明中指定的类型。
-如果类型变量用于类型声明,其类型是声明中指定的类型。
主题名称:类型约束
泛化类型变量的类型检查规则
在类型检查泛型函数或类型时,类型变量可以被泛化为超类型或子类型。以下为泛化类型变量的类型检查规则:
上界泛化(Contravariance)
*函数参数:
-当类型变量出现在函数参数位置时,可以被泛化到超类型。
*类型构造器参数:
-当类型变量出现在类型构造器参数位置时,例如列表类型`[a]`中的`a`,也可以被泛化到超类型。
上界泛化规则:
```
a:T=>a:S
```
其中:
*`a`是要泛化的类型变量。
*`T`是`a`的原有类型。
*`S`是`T`的超类型(即`T<:S`)。
下界泛化(Covariance)
*函数返回值:
-当类型变量出现在函数返回值位置时,可以被泛化到子类型。
*类型构造器结果类型:
-当类型变量出现在类型构造器结果类型位置时,例如列表类型`[a]`中的`a`,也可以被泛化到子类型。
下界泛化规则:
```
a:T=>a:S
```
其中:
*`a`是要泛化的类型变量。
*`T`是`a`的原有类型。
*`S`是`T`的子类型(即`S<:T`)。
泛化限制
泛化类型变量时,需要遵守以下限制:
*泛化的类型变量不能打破类型的协变性或逆变性规则。
*泛化的类型变量不能引入新的约束。
*泛化的类型变量不能修改类型的语义。
泛化示例
以下是一些泛化类型变量的示例:
*`map::(a->b)->[a]->[b]`
-函数参数`a`被泛化到超类型`Int`,因为`Int`是`a`的超类型。
*`last::[a]->Maybea`
-函数返回值`a`被泛化到子类型`String`,因为`String`是`a`的子类型。
*`Eitherab::Eitherab`
-类型构造器结果类型`a`被泛化到超类型`Int`,因为`Int`是`a`的超类型。
类型推论中的泛化
泛化类型变量也在类型推论中发挥着重要作用。编译器可以根据函数的类型签名和参数类型推断出类型变量的类型。
例如,考虑以下函数:
```
max::Orda=>a->a->a
```
编译器可以推断出类型变量`a`的类型为`Int`,因为`Int`是`Ord`类型的超类型,并且函数参数和返回值都是`Int`类型。
结论
泛化类型变量是泛型编程中的一项重要技术。它允许我们写出类型安全的代码,同时保持代码的通用性。泛化类型变量的类型检查规则确保泛化后的类型仍然是有效的,并且不会破坏类型的协变性或逆变性规则。第四部分泛化类型变量与派生类型的关系关键词关键要点【类型变量的泛化机制】:
1.泛化类型变量允许函数、类型和类具有可变类型的参数,从而提高了代码的可重用性和灵活性。
2.泛型代码使用类型参数来表示各种类型,使代码独立于任何特定类型,从而增强了代码的可重用性。
3.泛型类型变量通过类型推断和强类型检查来确保代码安全性和可靠性。
【协变和逆变】:
泛化类型变量与派生类型的关系
简介
泛化类型变量是Java5中引入的一项重要特征,它允许将类型参数化,从而提高代码的可重用性和灵活性。派生类型是通过从泛化类型变量派生的类型,它们继承了泛化类型变量的特性和约束。
泛化类型变量
泛化类型变量表示一种类型的占位符,可以在声明类、接口或方法时使用。它们使用尖括号内的类型变量名称表示,例如下面的`List<E>`:
```java
voidadd(Eelement);
Eget(intindex);
intsize();
}
```
泛化类型变量可以受限于上界(即其他类型),以确保类型的安全性和一致性。例如,`List<Number>`表示一个包含`Number`或其子类的元素列表。
派生类型
派生类型是通过将一个或多个实际类型参数传递给泛化类型变量而创建的。例如,`List<String>`是`List<E>`的派生类型,其中`E`被具体化为`String`。
关系
泛化类型变量和派生类型之间的关系是一种继承关系:
*派生类型继承了泛化类型变量的类型参数、方法和字段。
*派生类型还继承了泛化类型变量的上界和下界约束。
类型安全
泛化类型变量和派生类型之间的继承关系对于维护类型安全至关重要。由于派生类型继承了泛化类型变量的约束,因此只能向派生类型传递与泛化类型变量上界兼容的类型参数。
例如,以下代码将导致编译时错误,因为`List<Number>`不能接受`String`参数:
```java
List<Number>list=newArrayList<String>();
```
协变和逆变
泛化类型变量的协变性和逆变性决定了派生类型传递给泛化类型变量时的行为。
*协变类型变量(如`List<E>`):派生类型可以接受比泛化类型变量上界更具体的类型参数。例如,`List<Number>`可以接受`List<Integer>`。
*逆变类型变量(如`Comparator<E>`):派生类型可以接受比泛化类型变量上界更通用的类型参数。例如,`Comparator<Number>`可以接受`Comparator<Object>`。
总结
泛化类型变量和派生类型之间的关系对于提高Java代码的可重用性和灵活性至关重要。派生类型继承了泛化类型变量的特性,并强制执行类型安全。理解这种关系可以帮助开发人员编写健壮且可维护的泛型代码。第五部分泛化类型变量在类型推断中的应用关键词关键要点类型变量的泛化在类型推断中的应用
主题名称:泛化类型变量在类型推断中的作用
1.泛化类型变量允许类型推断器从一个函数调用的类型参数中推断出其他函数调用的类型参数。
2.这消除了对明确指定类型参数的需要,从而简化了代码并提高了可读性。
3.它还允许类型推断器处理嵌套函数调用和更高阶函数,否则这些调用和函数会很难推断类型。
主题名称:泛化类型变量的实例
类型变量的泛化在类型推断中的应用
类型变量的泛化是类型系统中的一项强大技术,它允许类型变量在不同的上下文中同时表示不同的类型。这在类型推断中有着广泛的应用,因为它允许编译器推断无法从代码中直接确定的泛型类型的具体类型参数。
类型推断
类型推断是一种编译器技术,它允许推断程序中未明确指定的变量和表达式的类型。编译器通过分析代码并结合类型系统规则来执行此操作。在没有类型变量泛化的语言中,编译器通常只能推断出简单类型,如整数和布尔值。
泛化类型变量
泛化类型变量允许类型变量表示不同的类型,具体取决于它们所在上下文的类型约束。例如,在一个函数中,类型变量可以表示函数参数的类型,而在函数返回类型中,相同的类型变量可以表示函数返回值的类型。
泛化类型变量的应用
泛化类型变量在类型推断中的应用包括:
*推断泛型类型参数:泛化类型变量允许编译器推断未明确指定的泛型类型参数。例如,在以下代码中,编译器可以推断出`List`的类型参数为`String`:
```
List<String>list=newArrayList<>();
```
*推断匿名内部类的类型:泛化类型变量还可以用于推断匿名内部类的类型。例如,在以下代码中,编译器可以推断出匿名内部类实现了`Comparator<String>`接口:
```
@Override
returnpareTo(o2);
}
});
```
*推断lambda表达式的类型:在支持lambda表达式的语言中,泛化类型变量可用于推断lambda表达式的类型。例如,在以下代码中,编译器可以推断出lambda表达式为`(String,String)->int`类型:
```
Comparator<String>comparator=(o1,o2)->pareTo(o2);
```
工作原理
类型推断使用泛化类型变量的工作原理如下:
1.编译器从上下文收集有关类型变量的约束。
2.编译器根据约束创建一个类型方程组。
3.编译器求解方程组以找到满足所有约束的类型。
4.如果方程组有多个解,编译器会选择最通用的解。
优势
泛化类型变量在类型推断中的应用具有以下优势:
*代码简洁性:它允许开发人员编写更简洁的代码,而无需明确指定类型。
*提高安全性:通过强制执行类型约束,它有助于防止类型错误。
*增强可读性:它使代码更容易理解,因为类型信息是隐式的。
局限性
泛化类型变量在类型推断中的应用也有一些局限性,包括:
*增加编译时间:类型推断过程可能会增加编译时间,尤其是在大型代码库中。
*潜在的歧义:在某些情况下,类型推断算法可能会产生模糊或不确定的结果。
结论
泛化类型变量的泛化是类型系统中一项强大的技术,它允许类型推断在更广泛的上下文中进行。通过推断无法从代码中直接确定的类型参数,它有助于提高代码简洁性、安全性、可读性和可维护性。第六部分泛化类型变量的类型转换规则关键词关键要点类型变量同质性要求
1.类型相同的变量必须具有相同的类型参数。
2.不同类型的变量不能具有相同的类型参数。
3.类型参数在整个代码块范围内必须保持一致,不能在不同代码块中更改。
类型参数推断
1.编译器可以根据实际参数的类型推断泛型函数或方法的类型参数。
2.类型参数推断简化了泛型代码的编写,减少了显式指定类型参数的需要。
3.编译器必须能够从实际参数中唯一确定类型参数,否则将产生类型推断错误。
泛型方法和类
1.泛型方法和类允许定义具有类型参数的方法和类,使它们可以处理各种数据类型。
2.泛型方法和类提供了代码可重用性,减少了重复代码的需求。
3.泛型方法和类的使用需要谨慎考虑类型安全性,以避免类型错误。
类型变量上限和下限
1.类型变量可以指定上限,这表示该变量只能是该上限类或其子类的实例。
2.类型变量也可以指定下限,这表示该变量只能是该下限类或其超类的实例。
3.类型变量的上限和下限用于确保类型安全性,防止无效的类型转换。
泛型集合
1.泛型集合允许定义和操作具有特定元素类型的集合。
2.泛型集合提供了类型安全的数据结构,防止添加不兼容的元素。
3.Java集合框架使用泛型集合,提供一系列可重用数据结构。
泛型的局限性
1.泛型不适用于原始类型(例如int、double)。
2.泛型不能提供完全的类型安全性,某些类型错误仍然可能发生。
3.使用泛型可能导致运行时效率低下,因为编译时无法确定确切类型。泛化类型变量的类型转换规则
在泛型编程中,类型变量的泛化是通过类型转换规则实现的。这些规则允许在泛型函数和类中使用类型变量,并确保类型安全。
上界类型转换
上界类型转换规则允许将一个类型变量转换为它的上界类型。考虑以下代码示例:
```
classBox<T:Number>(valvalue:T)
returnBox(value)
}
```
在`boxed`函数中,类型变量`T`具有上界`Number`。这表示`boxed`函数可以接受任何`Number`类型的值,并返回一个包含该值的`Box<Number>`。
下界类型转换
下界类型转换规则允许将一个类型变量转换为它的下界类型。考虑以下代码示例:
```
interfaceAnimal
classCat:Animal
returnvalue
}
```
在`animal`函数中,类型变量`T`具有下界`Animal`。这表示`animal`函数可以接受任何`Animal`类型的值,并返回一个与输入值具有相同类型的对象。
类型投影
类型投影是将类型变量转换为其确切类型的过程。考虑以下代码示例:
```
classBox<T>(valvalue:T)
returnbox.value
}
```
在`unbox`函数中,类型变量`T`的类型被投影到`box`类型的类型参数`T`。这允许函数返回与`box`存储的值具有相同类型的对象。
类型擦除
在Java和C#等语言中,泛型类型变量会被擦除为原始类型。这意味着泛型类的实际类型将在编译时确定,并且在运行时无法访问类型变量。
类型推断
在Kotlin和Scala等语言中,编译器可以推断类型变量的实际类型。这允许开发人员在使用泛型函数和类时省略类型参数。
规则摘要
以下总结了泛化类型变量的类型转换规则:
-上界类型转换:类型变量可以转换为它的上界类型。
-下界类型转换:类型变量可以转换为它的下界类型。
-类型投影:类型变量可以投影到它的确切类型。
-类型擦除:在某些语言中,泛型类型变量在编译时被擦除。
-类型推断:在某些语言中,编译器可以推断类型变量的实际类型。
这些规则对于理解和使用泛型编程至关重要。它们确保了泛型代码的类型安全,并允许开发人员在不同类型上编写可重用的代码。第七部分泛化类型变量在多态编程中的意义关键词关键要点主题名称:类型变量的通用性
1.类型变量允许定义通用的函数和数据结构,这些函数和数据结构可以在多种类型上操作,而无需具体指定这些类型。
2.通用性是多态编程的基础,它使代码更具灵活性和可重用性,因为相同的代码可以在不同类型的输入上使用。
3.类型变量与参数化类型不同,参数化类型是在类型声明中指定明确类型的类型构造函数,而类型变量是一个通配符,可以匹配任何类型。
主题名称:多态性中的边界
泛化类型变量在多态编程中的意义
在多态编程中,泛型是一种将代码应用于各种数据类型而不必明确指定它们的技术。泛型通过使用类型变量来实现,这些变量充当占位符,可以在代码中任何需要的地方替换为具体类型。泛化类型变量是多态编程的关键要素,提供了以下几个方面的显著优势:
代码可重用性:
通过将代码泛型化,我们创建了可重复用于不同数据类型的一组通用操作。这减少了代码重复,提高了代码可维护性和可重用性。例如,一个泛型排序算法可以对任何类型的数据集合进行排序,无需编写特定于类型的代码。
类型安全:
泛型系统确保类型变量只能替换为兼容类型。这有助于防止类型错误,并确保在泛型代码中使用的数据类型是正确的。
灵活性和扩展性:
泛化类型变量使我们能够编写灵活且可扩展的代码,这些代码可以轻松地适用于新数据类型。这对于创建可扩展框架和库非常有用,这些框架和库可以支持各种数据类型。
编译时类型推断:
现代编程语言支持编译时类型推断,这允许编译器自动推断泛型代码中类型变量的类型。这简化了泛型代码的编写,减少了显式类型注释的需要。
多态函数和数据结构:
泛化类型变量允许我们定义多态函数(适用于所有类型)和数据结构(可以存储不同类型的数据)。这提供了高度灵活和通用的代码,可以显著简化复杂程序的实现。
泛化类型变量的实际应用:
泛化类型变量广泛应用于各种编程领域,包括:
*容器和集合:泛型列表、数组和映射用于存储和处理不同类型的数据。
*算法:泛型排序、搜索和遍历算法适用于任何类型的数据集合。
*框架和库:泛型API和类提供了可扩展、可重用的组件,可以适应各种数据类型。
*编译器和虚拟机:泛型元编程用于生成和优化代码,并扩展语言功能。
结论:
泛化类型变量是多态编程的基础,为代码可重用性、类型安全、灵活性和扩展性提供了至关重要的优势。它们允许我们编写可适用于各种数据类型的一组通用操作,并创建可扩展框架和库。通过利用泛化类型变量,我们可以显著简化复杂程序的实现,并促进软件开发的可维护性和可扩展性。第八部分泛化类型变量在高级类型系统中的应用泛化类型变量在高级类型系统中的应用
类型泛化
类型泛化是一种类型系统机制,允许在类型定义中使用类型变量,从而表示不同类型的抽象集合。通常,类型变量表示未知或未确定的类型参数,允许在类型定义中捕获和重用类型信息。
类型变量的泛化
泛化类型变量是指在类型系统中具有更宽泛语义的类型变量。它们允许在类型定义中捕获更广泛类型的集合,从而提高代码的可重用性和灵活性。
应用领域
泛化类型变量在高级类型系统中广泛应用于以下领域:
*参数化数据结构:泛化类型变量允许创建可处理不同类型元素的数据结构,例如列表、映射和集合。
*函数的高阶编程:泛化类型变量用于定义接受和返回泛型类型的函数,实现代码的高度重用性。
*类型约束:泛化类型变量可以与类型约束结合使用,以指定类型变量必须满足的条件,确保类型安全。
*模块化类型系统:泛化类型变量促进模块化类型系统的构建,允许在不同的模块中定义和使用类型,提高代码的可维护性和可扩展性。
实现
泛化类型变量的实现通常涉及以下步骤:
*在类型系统中引入类型变量:添加允许使用类型变量的语法和语义规则。
*定义类型变量的替换规则:指定如何用具体类型替换类型变量以形成特定类型实例。
*确保类型安全:通过类型检查和推论机制,确保使用泛化类型变量不会导致类型错误。
示例
以下示例演示了Java中泛化类型变量在参数化数据结构中的应用:
```java
privateT[]elements;
elements=(T[])newObject[0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 跨学科视角下的小学生综合计算能力培养策略研究总结
- DB6528T 210-2024板椒联合收获机作业技术规程
- DB6103T 82-2025夏大豆扩行缩株栽培技术规范
- 专业常年法律顾问聘任合同模板
- 个人投资入股合作合同协议
- 专利许可合同
- 买卖合同终止及赔偿协议
- 专兼职律师服务合同格式范本
- 个人咖啡店转让合同范本
- 产品设计与制造合同范本
- 法医病理学课件
- 职代会提案征集表
- 介绍uppc技术特点
- 物业工程工作分配及人员调配方案
- 《谏逐客书》理解性默写(带答案)最详细
- 《黑骏马》读书笔记思维导图
- 2023年物理会考真题贵州省普通高中学业水平考试试卷
- 盘扣式悬挑脚手架专项施工方案
- 劳动防护用品知识考试试题(含答案)
- 高中教师业务知识考试 数学试题及答案
- GB/T 9290-2008表面活性剂工业乙氧基化脂肪胺分析方法
评论
0/150
提交评论