当在另一个泛型类中也用作类型参数时,无法推断泛型类型

时间:2015-10-21 09:30:25

标签: java generics

请考虑以下代码。为什么我必须在withCastTest中而不是在withoutCastTest中转换为String?

当type参数用作另一个泛型类中的类型参数时,似乎java无法推断泛型类。在withoutCastTest中,我将type参数作为普通参数发送,它可以推断出正确的类型。这是为什么?不管怎么说呢?

如果问题形成怪异,我不确定命名约定。

public class RandomHelper {

    public interface RandomInterface<E> {
        public abstract E get();
    }

    public static abstract class Randomable<E> implements RandomInterface {

        protected E object;

        public Randomable(E object) {
            this.object = object;
        }

    }

    public static <E> E withCastTest(RandomInterface<E> action) {
        E savedObject = action.get();
        return savedObject;
    }

    public static <E> E withoutCastTest(RandomInterface<E> action, E e) {
        E savedObject = action.get();
        return savedObject;
    }

}

public class TestJava {

    public void run() {
        String s ="test";
        String ret = (String) RandomHelper.withCastTest(new Randomable<String>(s) {

            @Override
            public String get() {
                return object;
            }
        });

        String ret2 = RandomHelper.withoutCastTest(new Randomable<String>(s) {

            @Override
            public String get() {
                return object;
            }
        }, "test2");

        System.out.println(ret);
        System.out.println(ret2);

    }

    public static void main(String[] args) {
        TestJava test = new TestJava();
        test.run();
    }

}

编辑:代码中的错误

2 个答案:

答案 0 :(得分:1)

您只需在{/ 1>}

之后添加参数<E>即可
implements RandomInterface

然后你需要改变:(注意public abstract class Randomable<E> implements RandomInterface<E> { 方法的返回类型)

get

答案 1 :(得分:1)

您的抽象类没有实现通用接口

Randomable<E> implements RandomInterface<E>

缺失。

此外,您的实现不能返回Object,但必须返回String作为类型