0

我一直在尝试理解类型检查和类型转换。我已经理解了使用泛型对集合进行类型转换的概念,但是泛型在哪里允许对集合以外的非法类型转换进行强类型检查。有人可以为我提供一个示例,其中在编译时存在类型转换错误,泛型可以有效地处理这个问题。

提前致谢

4

4 回答 4

2

以这种情况为例:

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步骤抛出编译时错误,这可能会导致以后出现问题。

于 2013-09-13T08:38:58.877 回答
0

集合之外的示例之一是类实现generic接口时。例如,Comparable<T>Integeras实现

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) {
        // ...
    }
}    
于 2013-09-13T08:35:20.063 回答
0

JPA 在 s 中使用泛型TypedQuery来确保返回预期的类型。如果您要求 a Customer,则类型系统知道将查询结果视为Customer对象而不是您必须自己转换的纯Object文本,并且如果您使用 Criteria API,它还可以验证您的查询参数是否引用了有效属性类的Customer

于 2013-09-13T08:34:41.987 回答
0

一个非常基本的示例是用于构建对象的抽象类:

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)

因此,编译器在检查输入和输出的类型是否正确方面几乎没有帮助,这会迫使编译器在运行时进行潜在的不安全类型转换。

(免责声明:由于协方差和其他东西,这有点过于简单化了。)

于 2013-09-13T08:39:09.663 回答