Java 返回舱<;T>;从一种方法
我有两个类扩展了一个公共基类。基类有一些代码,对于一个具体的子类,需要知道另一个具体子类的Java 返回舱<;T>;从一种方法,java,Java,我有两个类扩展了一个公共基类。基类有一些代码,对于一个具体的子类,需要知道另一个具体子类的类。因此,给定Foo和Bar扩展Base,Foo的实例需要知道Bar.class,而Bar的实例需要知道Foo.class 而且,愚蠢的我,我正在尝试做正确的事情,并使用Java泛型来确保子类返回一个有效的Java类对象,一个扩展基类的对象 所以,我试过这个: class Base { abstract protected <T extends Base> Class<T> ge
类
。因此,给定Foo
和Bar
扩展Base
,Foo
的实例需要知道Bar.class
,而Bar
的实例需要知道Foo.class
而且,愚蠢的我,我正在尝试做正确的事情,并使用Java泛型来确保子类返回一个有效的Java类对象,一个扩展基类的对象
所以,我试过这个:
class Base {
abstract protected <T extends Base> Class<T> getOtherClass();
}
现在编译器抱怨需要在类
上进行强制转换
然后我试着:
class Foo extends Base {
@Override
protected Class<Base> getOtherClass() {
return Bar.class;
}
}
类Foo扩展了基{
@凌驾
受保护的类getOtherClass(){
返回Bar.class;
}
}
现在我收到两个抱怨:需要在类和返回值中进行强制转换
有没有一种表达方式可以避免任何类型转换?抽象类基类{
abstract class Base<T extends Base> {
abstract Class<T> getOtherClass();
}
class Foo extends Base<Bar> {
@Override Class<Bar> getOtherClass() { return Bar.class; }
}
抽象类getOtherClass();
}
类Foo扩展了基{
@重写类getOtherClass(){return Bar.Class;}
}
……或者
abstract class Base {
abstract Class<? extends Base> getOtherClass();
}
class Foo extends Base {
@Override Class<Bar> getOtherClass() { return Bar.class; }
}
抽象类基类{
抽象类第二个更像我想要的——我几分钟后就接受。出于好奇,你知道为什么?
有效而T
(正如我在问题中使用的)无效吗?谢谢!当你编写类getOtherClass()时
,您告诉编译器方法的调用方可以编写类clazz=myFoo.getOtherClass()
。您的意思是调用方可以选择Base
的子类型。这不是您的方法实现所说的。?扩展条
意味着实现选择了子类型,而调用方不知道它是什么。(也就是说,我认为如果你选择了选项2,当你发现自己被迫进行尴尬的角色转换时,你会发现自己已经选择了选项1。)啊!好吧,这是有道理的。再次感谢!关于选项1,对于这种特殊情况,我有理由相信选项2会起作用。这是一个非常简单的示例应用程序,用于测试Android O的行为变化。我自己并没有实际使用类
,我只是将其传递给Android(explicitIntent
constructor)。我不时尝试突破我对泛型更精细点的理解界限。:-)
abstract class Base<T extends Base> {
abstract Class<T> getOtherClass();
}
class Foo extends Base<Bar> {
@Override Class<Bar> getOtherClass() { return Bar.class; }
}
abstract class Base {
abstract Class<? extends Base> getOtherClass();
}
class Foo extends Base {
@Override Class<Bar> getOtherClass() { return Bar.class; }
}