Java 为什么要编译?代码似乎正在打破对类型参数的限制
在下面的测试中,TesterClass在其两个类型参数之间的关系上放置了一个约束。方法func2()似乎打破了这个约束,我希望它会在某个地方(在func2的定义上,或者当该类与字符串以外的任何第二个参数一起使用时)导致类型编译错误,但它不会 此外,如果调用func2并将结果保存在适当类型的变量中,编译将失败(取决于该变量的类型)。但是,尽管函数的返回类型在这两种情况下(向上转换之前)应该具有相同的类型,但执行相同的操作并保存到更通用的类型(如Object)中还是成功的 这是怎么回事 谢谢Java 为什么要编译?代码似乎正在打破对类型参数的限制,java,eclipse,generics,eclipse-jdt,compiler-bug,Java,Eclipse,Generics,Eclipse Jdt,Compiler Bug,在下面的测试中,TesterClass在其两个类型参数之间的关系上放置了一个约束。方法func2()似乎打破了这个约束,我希望它会在某个地方(在func2的定义上,或者当该类与字符串以外的任何第二个参数一起使用时)导致类型编译错误,但它不会 此外,如果调用func2并将结果保存在适当类型的变量中,编译将失败(取决于该变量的类型)。但是,尽管函数的返回类型在这两种情况下(向上转换之前)应该具有相同的类型,但执行相同的操作并保存到更通用的类型(如Object)中还是成功的 这是怎么回事 谢谢 pub
public class TestGenerics {
public static class ParamedType<T> {}
public class TesterClass<A extends ParamedType<B>, B> {
public TesterClass<A, B> func() {
return new TesterClass<A, B>();
}
public TesterClass<A, String> func2() {
return new TesterClass<A, String>();
}
}
public Object test() {
// How can I use these type parameters? Doesn't .func2 now have an invalid return type?
TesterClass<ParamedType<Integer>,Integer> testClass = new TesterClass<TestGenerics.ParamedType<Integer>, Integer>();
//TesterClass<ParamedType<String>, Integer> res2 = testClass.func2(); // <-- will not compile
Object res = testClass.func2(); // Compiles
return res;
}
}
公共类test泛型{
公共静态类参数类型{}
公共类TesterClass简单回答:它不会编译,至少在JavaC1.7下是这样的:
Test.java:10: type parameter A is not within its bound
public TesterClass<A, String> func2() {
^
where A,B are type-variables:
A extends ParamedType<B> declared in class Test.TesterClass
B extends Object declared in class Test.TesterClass
Test.java:11: type parameter A is not within its bound
return new TesterClass<A, String>();
^
where A,B are type-variables:
A extends ParamedType<B> declared in class Test.TesterClass
B extends Object declared in class Test.TesterClass
2 errors
Test.java:10:类型参数A不在其范围内
公共测试类func2(){
^
其中A、B为类型变量:
在类Test.TesterClass中声明的扩展参数类型
B扩展类Test.TesterClass中声明的对象
java:11:type参数A不在其范围内
返回新的TesterClass();
^
其中A、B为类型变量:
在类Test.TesterClass中声明的扩展参数类型
B扩展类Test.TesterClass中声明的对象
2个错误
你没有说你在编译什么-我猜你的Java编译器中有一个bug。显然,这是JDT.core中的一个Eclipse bug。我在上打开了一个bug报告,它不是为我编译的,javac 1.6.0\u 21
。它在Java 6.0合规性级别的Eclipse编译器下编译吗代码,但它仍然无法编译(通过JDK1.6.0_20中的javac)。缺少大括号是一个格式错误。(已修复)可能是JDT错误,这是我的JDT版本:3.6.1.r361_v20100714-0800-7Z8XFUSFLFMGLC5Z-Bvrt8-HVkH构建id:M20100909-0800I刚刚用javac 1.6.0_23进行了测试,它确实没有编译。顺便说一句,自从我在Eclipse上报告这个问题已经两年多了,它仍然没有修复。有人会认为,强制执行类型安全性在n Java编译器的临界级别。。。