给出一个通用接口:
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
类型的参数?
答案 0 :(得分:1)
发生这种情况是因为您忽略了警告“使用参数a”(或类似的东西)
使用:
A<String> a = new A<String>("hello");
当忽略通用相关警告时,代码可以在不应该编译时进行编译。
答案 1 :(得分:1)
这是有效的,因为a
实例仅键入A
类
你应该这样输入:
A<String> a = new A<String>("hello");
如果您不指定参数,则可以放置所有数据类型,例如String
,int
等。
答案 2 :(得分:1)
虽然其他答案解释了通常应该出现编译器警告。我正在寻找的解释以@JB Nizet提供的link to a previous post形式出现。
T t = new T<S>()
与
不同 T<S> t = new T<S>()
第一个是原始类型的示例。 我感兴趣的是为什么这是有效的(即......如果它编译并且不会抛出运行时错误)那么必须有一些东西。
该帖子的答案是详细的,并解释了为什么编译(长话短,向后兼容)。这篇文章详细介绍了Java的类型系统的含义。