Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回舱<;T>;从一种方法_Java - Fatal编程技术网

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(explicit
Intent
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; }
}