Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么要编译?代码似乎正在打破对类型参数的限制_Java_Eclipse_Generics_Eclipse Jdt_Compiler Bug - Fatal编程技术网

Java 为什么要编译?代码似乎正在打破对类型参数的限制

Java 为什么要编译?代码似乎正在打破对类型参数的限制,java,eclipse,generics,eclipse-jdt,compiler-bug,Java,Eclipse,Generics,Eclipse Jdt,Compiler Bug,在下面的测试中,TesterClass在其两个类型参数之间的关系上放置了一个约束。方法func2()似乎打破了这个约束,我希望它会在某个地方(在func2的定义上,或者当该类与字符串以外的任何第二个参数一起使用时)导致类型编译错误,但它不会 此外,如果调用func2并将结果保存在适当类型的变量中,编译将失败(取决于该变量的类型)。但是,尽管函数的返回类型在这两种情况下(向上转换之前)应该具有相同的类型,但执行相同的操作并保存到更通用的类型(如Object)中还是成功的 这是怎么回事 谢谢 pub

在下面的测试中,TesterClass在其两个类型参数之间的关系上放置了一个约束。方法func2()似乎打破了这个约束,我希望它会在某个地方(在func2的定义上,或者当该类与字符串以外的任何第二个参数一起使用时)导致类型编译错误,但它不会

此外,如果调用func2并将结果保存在适当类型的变量中,编译将失败(取决于该变量的类型)。但是,尽管函数的返回类型在这两种情况下(向上转换之前)应该具有相同的类型,但执行相同的操作并保存到更通用的类型(如Object)中还是成功的

这是怎么回事

谢谢

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编译器的临界级别。。。