4

在下面的测试中,TesterClass 对其两个类型参数之间的关系进行了约束。func2() 方法似乎打破了这个约束,我希望它会在某个地方(在 func2 的定义上,或者当该类与除 String 之外的任何第二个参数一起使用时)导致打字编译错误,但事实并非如此!

此外,如果我调用 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;
    }
}

编辑:这不会在 javac 中编译(下面报告的版本)。我正在使用 Eclipse,并试图找出实际运行的编译器是什么。会更新。可能是 JDT(Eclipse 编译器)错误。

我已经为 Eclipse 的 jdt 打开了一个错误报告: https ://bugs.eclipse.org/bugs/show_bug.cgi?id=333503

4

2 回答 2

6

简单的答案:它不能编译,至少在 javac 1.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

你没有说你在编译什么 - 我的猜测是你的 Java 编译器有一个错误。

于 2011-01-04T17:44:51.400 回答
0

Apparently, this is an Eclipse bug in JDT.core. I've opened a bug report at https://bugs.eclipse.org/bugs/show_bug.cgi?id=333503

于 2011-01-04T18:55:42.463 回答