Java泛型,接口和类型约束

时间:2015-07-06 10:40:24

标签: java generics interface

给出一个通用接口:

public interface I<E> {
    public int interfaceMethod(E s);
}

和实现接口的通用类

public class A<T> implements I<T> {

    private T val;

    public A(T x) {
        val = x;
    }

    public int interfaceMethod(T val) {
        // looks like T should be of the same type as instance variable 'val'
        return 0;
    }

}

为什么以下工作?

public class Run {

    public static void main(String[] args) {

        A a = new A<String>("hello");

        System.out.println(a.interfaceMethod(100)); \\ returns 0
    }
}

我期望T中定义的方法interfaceMethod的{​​{1}}类型参数将方法约束为与提供给{{1}的构造函数的类型相同的参数}}。 (在这种情况下class A)。

为什么A不需要String类型的参数?

3 个答案:

答案 0 :(得分:1)

发生这种情况是因为您忽略了警告“使用参数a”(或类似的东西)

使用:

A<String> a = new A<String>("hello");

当忽略通用相关警告时,代码可以在不应该编译时进行编译。

答案 1 :(得分:1)

这是有效的,因为a实例仅键入A类 你应该这样输入:

A<String> a = new A<String>("hello");

如果您不指定参数,则可以放置所有数据类型,例如Stringint等。

答案 2 :(得分:1)

虽然其他答案解释了通常应该出现编译器警告。我正在寻找的解释以@JB Nizet提供的link to a previous post形式出现。

T t = new T<S>()

不同

T<S> t = new T<S>()

第一个是原始类型的示例。 我感兴趣的是为什么这是有效的(即......如果它编译并且不会抛出运行时错误)那么必须有一些东西。

该帖子的答案是详细的,并解释了为什么编译(长话短,向后兼容)。这篇文章详细介绍了Java的类型系统的含义。