我有这个有效的代码:
接口:
public interface Queries<T> {
List<User> runQuery(T query);
}
并使用界面:
public class UserQueries implements Queries<UserQuery> {
@Override
List<User> runQuery(UserQuery q){
}
}
我想用以下代码替换上面的内容,但是,它不起作用:
新界面:
public interface Queries {
// I want to pass the type parameter within the abstract method instead of the using Queries<T>
<T> List<User> runQuery(T query);
}
并使用新的界面(版本2):
public class UserQueries implements Queries {
// does not work, compiler complains:
// "The method runQuery(UserQuery) of type UserQueries must override or implement a supertype method
@Override
List<User> runQuery(UserQuery q) {
}
}
如何在类的方法接口中使用类型参数<T>
?
答案 0 :(得分:2)
您正在尝试混合两个概念,一个是泛型,另一个是继承。
版本1 在版本1中,您具有通用界面
public interface Queries<T>
在实现中,您将其限制为接受UserQuery
类型
public class UserQueries implements Queries<UserQuery> {
版本2 在版本2中,您具有使用通用抽象方法的具体接口
public interface Queries {
// I want to pass the type parameter within the abstract method instead of the using Queries<T>
<T> List<User> runQuery(T query);
}
因此,如果您实现Queries
接口,则必须提供所有抽象方法的实现(如果更改方法签名或方法的语法,则该方法在类中被视为不同的方法,但在类中则被视为抽象方法。界面)
答案 1 :(得分:0)
这是由于 Java的类型擦除而发生的。
这里发生的是,编译后,此代码<T> List<User> runQuery(T query)
更改为List<User> runQuery(Object query)
。这就是为什么在子类中不能使用具体实现的原因。