当前位置: 首页 > 知识库问答 >
问题:

在 Java 中实现具有多个泛型类型的抽象泛型方法

田志尚
2023-03-14

它是关于java中具有两种泛型类型(一种用于返回类型,另一种用于形式参数)的泛型方法以及如何实现它。我想我在图片中缺少一些东西来让它工作。

事情是这样的...

这是工作 :

public enum Getter
{
    BillItemsSize {
        @Override
        public Integer get (Object entity) {
            DesiredClass ref = (DesiredClass ) entity; // "Old time" cast
            // do things...
        }
    };

    public abstract <T,K> T get (K entity);        
}

这不起作用:

public enum Getter
{
    BillItemsSize {
        @Override
        public Integer get (DesiredClass entity) { // no cast at all
            // do things
        }
    };

    public abstract <T,K> T get (K entity);        
}

java编译器告诉我:

<anonymous datasource.db.Getter$1> is not abstract and does not override abstract method <T,K>get(K) in Getter

好吧,就是这样。提前感谢大家!希望它能在未来帮助别人!

P、 D:这不是枚举类型的问题。它发生在类和层次结构之间。所以别怪Enum了,我试过了,但没用。

public abstract class SuperClass
{
    public abstract <T,E> T pepe (E e);
}

public class SubClass extends SuperClass
{

    @Override
    public Integer pepe(DesiredClass e) // fails... 
    {
        return null;
    }
    
}

对于泛型参数

我们可以做一个一般规则声明,对于“泛型参数”(那些类型是泛型的),方法签名中隐式采用的类型等于该泛型的上限,如果没有指定任何内容,可以是Object,或者如果使用上限,则可以是更具体的子类(在示例T中扩展String)。

对于泛型,返回类型

使用特定的返回类型覆盖泛型方法没有问题,只要返回类型是被覆盖的返回类型的子类型即可。首先的返回类型是什么?好吧,它恰好是对象。默认情况下,编译器假定(在方法签名中)泛型类型为 Object 类型。

因此,我们必须知道诀窍是知道任何具有泛型返回类型的方法实际上都具有Object返回类型。然后,如果在任何子类中,该方法被覆盖,并且我们更改他返回的类型,说明返回另一个类型,则不会有问题。因为,除了该方法将返回另一个类的对象之外,返回的对象将不可避免地成为 Object 类的子类,并且只要它是原始方法的子类型,就不会有问题覆盖具有不同返回类型的方法。称为协变返回类型的技术允许我们做这样的事情。

public abstract class SuperClass
{
    public abstract <T> T operation ();
}


public class SubClass extends SuperClass
{

    @Override
    public Chair operation()
    {
        //bla bla 
    }
    
}   

同时在代码的另一部分...

void main ()
{
        SubClass sb = new SubClass();
        Chair chair = sb.operation ();
        // the chair type can be easely replaced by super type (like Object)
        Object object = sb.operation();
}

感谢所有帮助清除这个问题的人!

共有2个答案

邹斌
2023-03-14

作为JB Nizet答案的补充,当您写下:

<代码>

它隐含的意思是:

<代码>

该方法必须接受任何对象。在子类上将其限制为 DesiredClass 实际上不会覆盖任何内容,如错误消息所示。

<罢工> 重写的方法必须具有完全相同的签名,参数或返回类型中不允许子/超级类型。

编辑:实际上,正如评论中所讨论的,String public foo();有效地覆盖了Object public foo();

上官季
2023-03-14
public abstract <T,K> T get (K entity);        

是一个可以将任何内容作为参数并允许返回任何内容的方法。

public Integer get (DesiredClass entity)

这不起作用,因为您将可以传递给方法的参数类型限制为DesiredClass,从而打破了Liskov原则。

没有泛型会更容易理解。假设您在类Bar中有一个抽象方法:

public abstract void fillRecipient(Recipient r);

并且您尝试在SubBar中覆盖它

public void fillRecipient(Glass glass) {
}

如果上述行为合法,下面的代码会做什么?

Bar bar = new SubBar();
bar.fillRecipient(new Mug());
 类似资料:
  • 编译时,此代码将产生以下+错误: 问题是访问中的类型T与列表中的T不相同。如何修复此编译问题?

  • 在java中,是否可以使用通配符定义抽象方法,但在实现中使用具体类型 eg: 在这样的抽象类中定义抽象方法 实现如下抽象方法,其中CorporateServer扩展了用户:

  • 问题内容: 如果在Java中创建泛型类(该类具有泛型类型参数),则可以使用泛型方法(该方法带有泛型类型参数)吗? 考虑以下示例: 正如您对通用方法所期望的那样,我可以使用任何对象调用的实例: 但是,如果我尝试使用 不 指定泛型类型的实例,则无论传入什么,我都会调用返回, 奇怪的是,如果返回类型是通用类,它将编译(例如(实际上,这可以解释-参见下面的答案)): 此外,如果输入通用类,即使仅使用通配符

  • 如果在Java中创建泛型类(该类具有泛型类型参数),是否可以使用泛型方法(该方法采用泛型类型参数)? 考虑下面的例子: 正如您所期望的那样,对于任何对象,的实例,我都可以调用: 但是,如果我试图使用的实例而不指定泛型类型,那么调用将返回一个

  • 例如,我有以下接口 实现此接口的抽象类 以及具体实施 我想建议所有将转换为任何内容的方法。我创建了以下方面 这是行不通的。Spring不会为类创建代理。然而,如果我从抽象类重写方法,它将开始工作,Spring成功地为创建代理,并执行所有需要的逻辑。 为什么会发生这种情况?有没有办法定义切入点,这样我就不需要重写方法?

  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或