我一直在尝试理解类型检查和类型转换。我已经理解了使用泛型对集合进行类型转换的概念,但是泛型在哪里允许对集合以外的非法类型转换进行强类型检查。有人可以为我提供一个示例,其中在编译时存在类型转换错误,泛型可以有效地处理这个问题。
提前致谢
以这种情况为例:
public class Test {
public static void main(String[] args) {
Pair<Integer, Integer> p1 = new Pair<Integer, Integer>(3, 5);
Pair<String, Integer> p2 = (Pair<String, Integer>) p1;
Pair p = new Pair<Integer, Integer>(3, 5);
Pair<String, Integer> p3 = (Pair<String, Integer>) p;
}
static class Pair<A, B> {
A first;
B second;
public Pair(A a, B b) {
first = a;
second = b;
}
}
}
因为泛型,Pair<String, Integer> p2 = (Pair<String, Integer>) p1
会引发编译错误。
但是由于p
不使用泛型,因此不会为该p3 = (Pair<String, Integer>) p
步骤抛出编译时错误,这可能会导致以后出现问题。
集合之外的示例之一是类实现generic
接口时。例如,Comparable<T>
由Integer
as实现
Integer implements Comparable<Integer>
确保只有Integer
实例可以与Integer
.
通用 compareTo()
方法在接口中定义为
public interface Comparable<T> {
public int compareTo(T o);
}
该类Integer
将其实现为
public class Integer implements Comparable<Integer> {
// ...
public int compareTo(Integer anotherInteger) {
// ...
}
}
JPA 在 s 中使用泛型TypedQuery
来确保返回预期的类型。如果您要求 a Customer
,则类型系统知道将查询结果视为Customer
对象而不是您必须自己转换的纯Object
文本,并且如果您使用 Criteria API,它还可以验证您的查询参数是否引用了有效属性类的Customer
。
一个非常基本的示例是用于构建对象的抽象类:
public abstract class BuilderBase<T, P> {
public T build(P parameter);
}
实现可能类似于
public class IntBuilder extends BuilderBase<Integer, String> {
public Integer build(String parameter) {
return Integer.parse(parameter);
}
}
如果没有泛型,build
签名必须是
public Object build(Object parameter)
因此,编译器在检查输入和输出的类型是否正确方面几乎没有帮助,这会迫使编译器在运行时进行潜在的不安全类型转换。
(免责声明:由于协方差和其他东西,这有点过于简单化了。)