通配符捕获错误

时间:2010-09-28 14:40:42

标签: java generics wildcard

我正在处理的课程如下,

public interface One{
     public Two get();
}

public class Foo{...}
public class Bar extends Foo{...}

public abstract class Parent<T extends Foo> implements One {...}

public abstract class Child<T extends Foo> extends Parent<T>

我有一个静态方法,它将返回一个给定Foo对象的Child对象,

public static Child<? extends Foo> get(Foo f){...}

此方法返回从Foo或Bar对象构造的子级。抛出错误的代码就是这个,

Foo f = new Foo();
Child<? extends Foo> child = O.get(f);
Two t = S.apply(child);

应用方法,

public Two apply(One o){...};

抛出的错误是,

apply(One) in S cannot be applied to (Child<capture#123 of ?>)

我目前解决此问题的方法是将代码更改为

Foo f = new Foo();
Child<? extends Foo> child = O.get(f);
Object o = child;
One one = (One)o;
Two t = S.apply(one);

这解决了错误,我不知道为什么显式转换为对象需要在那里,但它确实存在。

任何人都可以告诉我是否可以修改代码,因此不需要使用强制转换来实现这一点吗?

1 个答案:

答案 0 :(得分:0)

我想我可以告诉你。不幸的是,你缺少很多代码,但我之前已经看过这种事情,并知道如何解决它。解决它涉及一种不常见的java语法。

首先,您必须输入静态方法,如下所示:

public static <T extends Foo> Child<T> get(Foo f){...}

虽然没有看到代码,但是有可能在给定更改后,这将有效:

Two t = S.apply(child);

但是,如果需要,您可以根据需要提供类型,如下所示:

Two t = S.<Two>apply(child); // Cool huh?

此语法是强制类型化静态方法的类型。

我不确定这个确切的代码是否适合您,因为您没有提供足够的代码,但如果不是这样,解决方案将非常接近。

如果这不起作用,请发布您所拥有的相关代码的所有,我会尝试让它为您服务。