一个让我拥有不同返回类型的泛型类(Java)

一个让我拥有不同返回类型的泛型类(Java),java,generics,polymorphism,Java,Generics,Polymorphism,今天,我在java()中使用泛型/参数化类型,练习我对多态性的理解,但由于我有一段时间遇到了一个问题,我会使用一个泛型类和一个返回值的方法,原因是我希望能够调用一个方法,并且根据上下文能够有不同的返回类型 class dummy <E>{ E value; public E getValue(){ return value; } class dummy1 extends dummy<E>{ int value; p

今天,我在java()中使用泛型/参数化类型,练习我对多态性的理解,但由于我有一段时间遇到了一个问题,我会使用一个泛型类和一个返回值的方法,原因是我希望能够调用一个方法,并且根据上下文能够有不同的返回类型

class dummy <E>{
    E value;
    public E getValue(){
         return value;
    }
class dummy1 extends dummy<E>{
    int value;
    public int getValue(){
         return int;
    }
class dummy2 extends dummy<E>{
    boolean value;
    public boolean getValue(){
         return boolean;
    }
类虚拟{
E值;
公共E getValue(){
返回值;
}
类dummy1扩展了dummy{
int值;
public int getValue(){
返回int;
}
类dummy2扩展了dummy{
布尔值;
公共布尔getValue(){
返回布尔值;
}

这是可能的吗?我不确定这是否是做这类事情的正确方法。问题是,在Java原语中,例如
int
boolean
,不能是泛型参数

您需要将它们交换为等效的引用类型:
Integer
Boolean

另外,
E
的作用域是
dummy
类。您需要为超类提供类型参数

class Dummy<E> {
    private E value;
    public Dummy(E value) {
         this.value = value;
    }
    public E getValue() {
         return value;
    }
}
class Dummy1 extends Dummy<Integer> {
    public Dummy1(Integer value) {
         this.value = value;
    }
}
class Dummy2 extends Dummy<E> {
    public Dummy2(Boolean value) {
         this.value = value;
    }
}
类虚拟{
私人股本价值;
公共虚拟(E值){
这个值=值;
}
公共E getValue(){
返回值;
}
}
类Dummy1扩展了Dummy{
公共Dummy1(整数值){
这个值=值;
}
}
类Dummy2扩展了Dummy{
公共Dummy2(布尔值){
这个值=值;
}
}
或:

抽象类虚拟{
公共摘要E getValue();
}
类ReferenceDummy扩展了Dummy{
私人最终价值;
公共Dummy1(E值){
这个值=值;
}
@重写公共getValue(){
返回值;
}
}
类Dummy1扩展了Dummy{
私有int值;
公共Dummy1(int值){
这个值=值;
}
@重写公共整数getValue(){
返回值;
}
}
类Dummy2扩展了Dummy{
私有布尔值;
公共Dummy1(布尔值){
这个值=值;
}
@重写公共布尔getValue(){
返回值;
}
}

请注意,例如,
boolean getValue()
不能重写
boolean getValue()
出于某些原因。

谢谢你的回答,我有两个问题。为什么我必须向这个伪函数添加参数,为什么它的函数签名中没有返回值?@Hackermann我在多次编辑中添加了我的答案。你的意思是在第一个示例中吗?这些是为
接收值的构造函数当我尝试使用您的解决方案的第一个版本时,它要求一个构造函数Dummy()。这就是您在说“E的作用域也是Dummy类。您需要为超类提供类型参数”时所指的吗?@Hackermann
E
Dummy
中声明,因此仅在
Dummy
中有意义。当您引用
Dummy
时,您需要指定(或暗示)参数应该是什么。这包括在
extends
子句中,构造泛型类的新实例并声明对实例的引用。在某些地方,它可以由语言推断,例如
Dummy dummyString=new Dummy(“某些文本”);
abstract class Dummy<E> {
    public abstract E getValue();
}
class ReferenceDummy<E> extends Dummy<E> {
    private final E value;
    public Dummy1(E value) {
         this.value = value;
    }
    @Override public E getValue() {
         return value;
    }
}
class Dummy1 extends Dummy<Integer> {
    private int value;
    public Dummy1(int value) {
         this.value = value;
    }
    @Override public Integer getValue() {
         return value;
    }
}
class Dummy2 extends Dummy<Boolean> {
    private boolean value;
    public Dummy1(boolean value) {
         this.value = value;
    }
    @Override public Boolean getValue() {
         return value;
    }
}