【发布时间】:2016-03-19 17:47:28
【问题描述】:
我正在编写的通用框架存在问题。 有人可以向我解释一下,为什么我的代码无法编译?我试图用这个简单的例子来展示它。 (更新示例)
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
public class TestGeneric {
public static void main(String... sss) throws Exception {
Dao dao = new Dao("Hello");
dao.extend();
System.out.println(dao.getHelloWorld());
}
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface TestAnnotation {
public Class<? extends AbstractCommand<? extends AbstractDao>>[] commands() default {};
}
abstract class AbstractDao {
public void extend() throws Exception {
for (Field field : this.getClass().getDeclaredFields()) {
if (field.isAnnotationPresent(TestAnnotation.class)) {
TestAnnotation annotation = field.getAnnotation(TestAnnotation.class);
for (Class<? extends AbstractCommand<? extends AbstractDao>> commandClass : annotation.commands()) {
AbstractCommand<? extends AbstractDao> command = commandClass.newInstance();
command.doSomething(this);
}
}
}
}
}
class Dao extends AbstractDao {
@TestAnnotation(commands = { Command.class })
private String hello;
private String world;
public Dao(String hello) {
this.hello = hello;
}
public String getHello() {
return this.hello;
}
public void setWorld(String world) {
this.world = world;
}
public String getHelloWorld() {
return this.hello + " " + this.world;
}
}
abstract class AbstractCommand<T extends AbstractDao> {
public abstract void doSomething(T t);
}
class Command extends AbstractCommand<Dao> {
@Override
public void doSomething(Dao t) {
if (t.getHello().equals("Hello")) {
t.setWorld("World");
}
}
}
只要我做出以下更改...
abstract class AbstractCommand<T extends AbstractDao> {
public abstract void print(AbstractDao t);
}
class Command extends AbstractCommand<Dao> {
@Override
public void doSomething(AbstractDao t) {
Dao dao = (Dao) t;
if (dao.getHello().equals("Hello")) {
dao.setWorld("World");
}
}
}
...一切正常,但我必须一直使用 AbstractDao。
据我所知,一切都应该保存,但我不断收到此错误。
AbstractCommand 类型中的方法 print(capture#3-of ? extends AbstractDao) 不适用于参数 (Dao)
但是 Dao 扩展了 AbstractDao,那么问题到底出在哪里?
我已经找到了这个问题generics error: not applicable for the arguments,但我不确定这是否与我遇到的问题相同。
有人有解决这个问题的办法吗?
谢谢!
【问题讨论】:
-
你想做什么?
AbstractCommand<? extends AbstractDao>表示它是扩展AbstractDao的 some 未知类型的AbstractCommand。这可能是也可能不是Dao,编译器无法知道。 -
可能重复 stackoverflow.com/q/2723397/2891664。
AbstractCommand是消费者,而不是生产者。 -
我已经更新了我的示例,使其更清楚,我试图实现的目标。 Dao 有什么方法不能扩展 AbstractDao 吗?
标签: java generics bounded-wildcard