我正在处理的课程如下,
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);
这解决了错误,我不知道为什么显式转换为对象需要在那里,但它确实存在。
任何人都可以告诉我是否可以修改代码,因此不需要使用强制转换来实现这一点吗?
答案 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?
此语法是强制类型化静态方法的类型。
我不确定这个确切的代码是否适合您,因为您没有提供足够的代码,但如果不是这样,解决方案将非常接近。
如果这不起作用,请发布您所拥有的相关代码的所有,我会尝试让它为您服务。