我最近开始为一个项目编写一个通用的对象映射器,并遇到了一些我不太了解的东西.鉴于以下内容:
public class G<X> {
public G(Class<X> c) { }
public void m(X x) { }
public static <T> G<T> create(Class<T> c) {
return new G<T>(c);
}
public static void main(String[] args) {
Object o = ""; // irrelevant!
G<?> t = create(o.getClass());
t.m(o);
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下编译错误:
m(capture#402 of ?) in G<capture#402 of ?> cannot be applied to (java.lang.Object)
Run Code Online (Sandbox Code Playgroud)
我似乎无法找到一种正确的方法t来进行编译.我错过了什么?使用JDK 1.6.
编辑:
这不是一个学术问题.我正在尝试将一个映射器从hibernate对象编写到相应的DTO,以便在REST层中传递.假设对于每个ORM对象Foo,可能存在一个FooDTO具有构造函数的类,该构造函数将实例Foo作为参数.映射Foo到的泛型类FooDTO将封装此假设并抛出适当的异常(如果FooDTO不存在或没有正确的构造函数):
class Mapper<Foo,FooDTO> {
private final Constructor<FooDTO> dtoConstructor;
Mapper(Class<Foo> fooClass, Class<FooDTO> fooDTOClass){
// find the constructor of FooDTO or throw ...
}
public FooDTO map(Foo f){
return dtoConstructor.newInstance(f);
}
// this factory is for convenience when we don't know the type of FooDTO:
public static Mapper<X,Object> create(Class<X> fromClass){
Class<Object> dtoClass = // ... find it
return new Mapper<X,Object>(fromClass,dtoClass);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我将泛型对象类传递给它,这似乎会破坏create.
请注意,我的实际实现具有FooDTO从泛型超类扩展的所有类,即,签名Mapper实际上是类似的Mapper<Foo,DTO<Foo>>.我认为这与此无关.
编辑2:
其实改变线的建议G<?> t = create(o.getClass());,以G<Object> t = (G<Object>) create(o.getClass());在这方面的工作.
不幸的是,我没有意识到我的班级更复杂的事实实际上有影响.这是一个更完整的例子(我为零碎的问题道歉):
public class Y<T> {
}
public class G<X, Z extends Y<X>> {
public G(Class<X> c, Class<Z> s) {
}
public void m(X x) {
}
public static <T, S extends Y<T>> G<T, S> create(Class<T> c) {
Class<S> s = null; // find this via some reflection magic
return new G<T, S>(c, s);
}
public static void main(String[] args) {
Object o = ""; // irrelevant!
G<? extends Object, Y<? extends Object>> t = create(o.getClass());
t.m(o);
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Class<S>使用反射创建对象,并为该类型的对象创建一些传统位置.这部分工作正常,应与此讨论无关.我现在得到的错误如下:
inconvertible types
found : G<capture#155 of ? extends java.lang.Object,Y<capture#155 of ? extends java.lang.Object>>
required: G<java.lang.Object,Y<java.lang.Object>>
Run Code Online (Sandbox Code Playgroud)
如果我将有罪的线路更改为:
G<Object, Y<Object>> t = (G<Object, Y<Object>>) create(o.getClass());
Run Code Online (Sandbox Code Playgroud)
我得到一个类似的错误:
java: inconvertible types
required: G<java.lang.Object,Y<java.lang.Object>>
found: G<capture#1 of ? extends java.lang.Object,Y<capture#1 of ? extends java.lang.Object>>
Run Code Online (Sandbox Code Playgroud)
我再一次为零碎的信息道歉.在我写作的时候,我正在整理这个.
你这里拥有的是消费者。但是,以下内容似乎可以编译(在 Eclipse 中)。
public static class G<X, Z extends Y<X>> {
public G(Class<? extends X> c, Class<Z> s) {}
public void m(X x) {}
public static <T, S extends Y<T>> G<T, S> create(Class<? extends T> c) {
Class<S> s = null; // find this via some reflection magic
return new G<T, S>(c, s);
}
public static void main(String[] args) {
Object o = ""; // irrelevant!
create(o.getClass()).m(o);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
205 次 |
| 最近记录: |