Java 通配符捕获错误

Java 通配符捕获错误,java,generics,wildcard,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 Pare

我正在处理的课程如下:

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>
抛出的错误是

apply(One) in S cannot be applied to (Child<capture#123 of ?>)
S中的应用(一个)不能应用于(子项) 我目前解决这个问题的方法是将代码更改为

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

孩子我想我可以告诉你。不幸的是,您丢失了很多代码,但我以前见过这种情况,并且知道如何处理它。解决这个问题涉及到一种不常见的java语法

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

public static <T extends Foo> Child<T> get(Foo f){...}
Two t = S.<Two>apply(child); // Cool huh?
但是,如果需要,可以根据需要提供类型,如下所示:

public static <T extends Foo> Child<T> get(Foo f){...}
Two t = S.<Two>apply(child); // Cool huh?
Two t=S.apply(child);//酷吧?
此语法是强制类型化静态方法的类型的方式

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


如果这不起作用,请发布您所有的相关代码,我会尽力让它为您工作。

在为1.5和1.6编译时,您提供的代码在没有给定解决方法的情况下对我有效。这几乎就像孩子不知道父母实现了一个。是的,我会清理和重建。或者,如果你没有给我们一个展示问题的例子,请给我们一个展示问题的例子。是夜间构建引发了错误,所以我不太确定确切的编译器设置是什么。我现在正试图找到一种更好地复制它的方法。你是通过IDE还是用javac编译的?Eclipse说一切都很好,但当我通过ant执行时,它会抛出错误。@ILMTitan您如何编译它?我遗漏了什么吗?这里的
2
是什么?它是接口还是类<代码>两个t=S。适用(一个)S
是什么?此静态
get
方法与原始方法的含义不同。在这里,调用者可以决定什么是参数类型,而使用
child时,
apply
方法似乎是非泛型的,您不能在这里提供类型参数。如果您返回并阅读我的帖子,您将看到此方法需要两个步骤-第一步是参数化方法-参见步骤1。在我的回答中,这里有两种方法-一种是应用方法,另一种是
get
方法。如果我理解正确,您将类型参数添加到
get
(然后没有将其用作参数类型),但没有更改
apply
。(当然,最后一句话你是对的:没有所有的代码,我们在这里什么都做不了。)@Paŭlo你还需要什么代码?其中有很多,我已经厌倦了只包含相关的片段。
Two t = S.apply(child);
Two t = S.<Two>apply(child); // Cool huh?