你如何使用泛型类型作为返回值和泛型类型作为参数? [英] How do you use a generic type as return value and a generic type as a parameter?

查看:747
本文介绍了你如何使用泛型类型作为返回值和泛型类型作为参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试用泛型创建一个抽象类。业务逻辑是将文本从一种语言翻译成另一种语言。每种语言必须有 Translator 类。我还需要每种语言的 LanguageTranslation 类,它是 translate 方法的返回对象,参数 T 。该T应该是 OriginalText 的子类(例如EnglishText,ChineseText等)。这就是我奋斗的地方。你如何编写这个约束?



我已经创建了下面的超类。

  public abstract class Translator< T,V> {
public abstract< V extends LanguageTranslation> V translate(T originalText);
}

如果我误解了泛型的概念或者错误地使用它,请照亮。

解决方案

只需将其添加到您定义泛型的地方即可:

  public abstract class Translator< T extends OriginalText,V> {
public abstract< V extends LanguageTranslation> V translate(T originalText);





顺便说一句,这很混乱,因为 V 定义在您的方法中被覆盖。为什么不这样做:

  public abstract class Translator< T extends OriginalText,V extends LanguageTranslation> {
public abstract V translate(T originalText);

编辑:解释为什么你对V有一个警告



完全相同:

  public abstract class Translator < T扩展OriginalText,V> {
public abstract< K extends LanguageTranslation> K translate(T originalText);
}

现在在这个方法里面有3个泛型:


  • 运行时确定的LanguageTranslation的子类型的K
  • 运行时确定的OriginalText子类型的T
  • V运行时确定的对象的子类型(默认约束)

I try to create an abstract class with generics. The business logic is to translate a text from one language to another. There must be a Translator class for each language. I also require a LanguageTranslation class for each language, which is the return object of the translate method, which takes on the parameter T. That T is supposed to be of a sub class of OriginalText (e.g. EnglishText, ChineseText, etc). And that is where I struggle. How do you code this constraint?

I've created the following super class.

public abstract class Translator <T, V> {            
    public abstract <V extends LanguageTranslation> V translate(T originalText);
}

If I misunderstand the concept of generics or apply it wrong, please illuminate. Thanks.

解决方案

Just add it where you define your Generics :

public abstract class Translator <T extends OriginalText, V> {            
    public abstract <V extends LanguageTranslation> V translate(T originalText);
}

Btw, this is confusing because the V definition is overriden in your method. Why not doing this :

public abstract class Translator <T extends OriginalText, V extends LanguageTranslation> {            
    public abstract V translate(T originalText);
}

EDIT: explaining why you have a warning on V

It's exactly the same as :

public abstract class Translator <T extends OriginalText, V> {            
    public abstract <K extends LanguageTranslation> K translate(T originalText);
}

Now inside the method you have 3 generics :

  • K of runtime determined subtype of LanguageTranslation
  • T of runtime determined subtype of OriginalText
  • V runtime determined subtype of Object (default constraint)

这篇关于你如何使用泛型类型作为返回值和泛型类型作为参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆