Java 如何通过几个扩展级别解析泛型类型?
我有以下三门课:Java 如何通过几个扩展级别解析泛型类型?,java,generics,inheritance,Java,Generics,Inheritance,我有以下三门课: public class MyClass1<T extends MyClass1> { private List list = new ArrayList(); public T add(Object... o) { Collections.addAll(this.list, o); return (T) this; } public MyClass2 two() { MyClas
public class MyClass1<T extends MyClass1> {
private List list = new ArrayList();
public T add(Object... o) {
Collections.addAll(this.list, o);
return (T) this;
}
public MyClass2 two() {
MyClass2 n = new MyClass2();
add(n);
return n;
}
}
public class MyClass2<T extends MyClass2> extends MyClass1<MyClass2> {
public MyClass3 three() {
MyClass3 n = new MyClass3();
add(n);
return n;
}
}
public class MyClass3<T extends MyClass3> extends MyClass2<MyClass3> {
}
出于某种原因,add(3)
返回MyClass1
,我本来希望它返回MyClass2
。如果我从MyClass2
中删除
,add(3)
会根据需要返回MyClass2
,但是MyClass3
无法使用类型扩展MyClass2
我如何才能做到这一点,这样我就可以链接所有的方法,并且仍然使用所有类中的add(Object…
方法
更新:
以上显然是一个例子。这里我真正想要创建的是一个用于构建MySQL查询的简单工具。我有很多EJB3实体,它们已经定义了我的表和列名,但需要进行一些本机查询,因为有些事情是EJB-QL无法实现的。然而,我不想在代码中多次指定表和列名,因此需要一个可以使用EJB3实体创建本机MySQL查询的工具。当我使用我创建的代码时,它可能如下所示:
new Query().select().field(MyEntity_.id).field(MyEntity_.name).field(MyOtherEnt_.type);
public class MyClass1<T extends MyClass1> {
private List list = new ArrayList();
public T add(Object... o) {
Collections.addAll(this.list, o);
return (T) this;
}
public MyClass2 two() {
MyClass2 n = new MyClass2();
add(n);
return n;
}
}
public class MyClass2 extends MyClass1<MyClass2> {
public MyClass3 three() {
MyClass3 n = new MyClass3();
add(n);
return n;
}
}
public class MyClass3 extends MyClass1<MyClass3> {
public void four() {}
}
或:
这里我可能有一个查询对象,它指定一些通用的MySQL语法,然后对其进行扩展。它可以是这样的:查询>按选择扩展>按子查询扩展。整个过程都是针对我正在处理的特定项目定制的。add(3)
返回MyClass1
,因为方法add
是类MyClass1
的成员。为了返回不同的数据类型,您必须在扩展类中重写add
方法
MyClass2
的定义应该大致如此
class MyClass2<T extends MyClass2> extends MyClass1<MyClass2> {
@Override
public T add(Object... o) {
super.add(o);
return (T)this;
}
public MyClass3 three() {
MyClass3 n = new MyClass3();
add(n);
return n;
}
}
类MyClass2扩展了MyClass1{
@凌驾
公共T添加(对象…o){
增补(o);
返回(T)这个;
}
公共MyClass3三(){
MyClass3 n=新的MyClass3();
添加(n);
返回n;
}
}
不管怎样,我不知道你想达到什么目的,但我知道你采取了什么坏方法。此外,当您创建新的参数化对象时,您没有声明类型T
,因此,对于编译器和JRE来说,这里的所有内容都只是对象的类型。add(3)
返回MyClass1
,因为方法add
是类MyClass1
的成员。为了返回不同的数据类型,您必须在扩展类中重写add
方法
MyClass2
的定义应该大致如此
class MyClass2<T extends MyClass2> extends MyClass1<MyClass2> {
@Override
public T add(Object... o) {
super.add(o);
return (T)this;
}
public MyClass3 three() {
MyClass3 n = new MyClass3();
add(n);
return n;
}
}
类MyClass2扩展了MyClass1{
@凌驾
公共T添加(对象…o){
增补(o);
返回(T)这个;
}
公共MyClass3三(){
MyClass3 n=新的MyClass3();
添加(n);
返回n;
}
}
不管怎样,我不知道你想达到什么目的,但我知道你采取了什么坏方法。此外,当您创建新的参数化对象时,您没有声明类型T
,因此总而言之,对于编译器和JRE来说,这里的所有内容都是对象类型。您最大的问题是扩展了原始类型。更改:
public class MyClass1<T extends MyClass1> {
公共类MyClass1{
到
公共类MyClass1{
使用原始类型后,所有泛型信息都将从类中剥离
与其他类类似。您最大的问题是扩展原始类型。更改:
public class MyClass1<T extends MyClass1> {
公共类MyClass1{
到
公共类MyClass1{
使用原始类型后,所有泛型信息都将从类中剥离
其他类也一样。现在我决定让它更简单一点,让MyClass3
扩展MyClass1
,而不是MyClass2
。如果我把它保持在“2级”,它是有效的,因此如果我希望能够从MyClass1
链接方法,我将不得不接受MyClass3
无法扩展MyClass2
的约束。我的代码如下所示:
new Query().select().field(MyEntity_.id).field(MyEntity_.name).field(MyOtherEnt_.type);
public class MyClass1<T extends MyClass1> {
private List list = new ArrayList();
public T add(Object... o) {
Collections.addAll(this.list, o);
return (T) this;
}
public MyClass2 two() {
MyClass2 n = new MyClass2();
add(n);
return n;
}
}
public class MyClass2 extends MyClass1<MyClass2> {
public MyClass3 three() {
MyClass3 n = new MyClass3();
add(n);
return n;
}
}
public class MyClass3 extends MyClass1<MyClass3> {
public void four() {}
}
现在我决定让它更简单一点,让MyClass3
extendMyClass1
而不是MyClass2
。如果我把它保持在“2级”,它是有效的,因此如果我希望能够从MyClass1
链接方法,我将不得不接受MyClass3
无法扩展MyClass2
的约束。我的代码如下所示:
new Query().select().field(MyEntity_.id).field(MyEntity_.name).field(MyOtherEnt_.type);
public class MyClass1<T extends MyClass1> {
private List list = new ArrayList();
public T add(Object... o) {
Collections.addAll(this.list, o);
return (T) this;
}
public MyClass2 two() {
MyClass2 n = new MyClass2();
add(n);
return n;
}
}
public class MyClass2 extends MyClass1<MyClass2> {
public MyClass3 three() {
MyClass3 n = new MyClass3();
add(n);
return n;
}
}
public class MyClass3 extends MyClass1<MyClass3> {
public void four() {}
}
你试过参数化方法调用吗?这一切看起来都很复杂。你到底想实现什么?这是解决方案的问题是什么?请看我的更新。嗯,为什么你需要这么多泛型扩展?对我来说听起来像是一个单层。顺便说一句,你试图实现的是创建eg框架的一部分HIBERNATE size。检查查询和条件等类的源代码。因为你要重新发明轮子,我认为你会浪费很多时间。如果不是因为这个问题,它将在明天完成。我目前只有5个,也许6个本地查询,所有内容都是专为我正在尝试的任务设计的这并不是我试图创建一个广泛、坚实的框架并将其发布到世界各地。你是否尝试对方法调用进行参数化?这一切看起来都很复杂。你到底想实现什么?这是解决方案的问题是什么?请看我的更新。嗯,为什么你需要这么多泛型扩展对我来说,s?听起来像是一个单层。顺便说一句,你想要实现的是创建一部分如HIBERNATE大小的框架。检查它的源代码,比如查询和条件。因为你要重新发明轮子,我想你会浪费很多时间。如果不是这个问题,明天就会完成。我已经完成了目前只有5个,也许6个本地查询,所有的东西都是专门为我要完成的任务而设计的,但事实并非如此