Java 在这种情况下,如何正确使用泛型?

Java 在这种情况下,如何正确使用泛型?,java,generics,design-patterns,interface,Java,Generics,Design Patterns,Interface,下面是我的变压器接口 public interface Transformer<BusinessObject, O extends State> { public O transformToState(BusinessObject input); } 公共接口转换器 { 公共O transformToState(业务对象输入); } 这是我的一个变形金刚 public class GoldTransformer implements Transformer<Busi

下面是我的变压器接口

public interface Transformer<BusinessObject, O extends State>
{
    public O transformToState(BusinessObject input);
}
公共接口转换器
{
公共O transformToState(业务对象输入);
}
这是我的一个变形金刚

public class GoldTransformer implements Transformer<BusinessObject, Gold>
{
    @Override
    public Gold transformToState(BusinessObject input) {
        GoldBO goldbo= (GoldBO) input; // redundant casting line
        //do some transformation with BO to make it a state with some business logic
    }
}
公共类GoldTransformer实现Transformer
{
@凌驾
public Gold transformToState(BusinessObject输入){
GoldBO GoldBO=(GoldBO)输入;//冗余铸造线
//对BO进行一些转换,使其成为具有一些业务逻辑的状态
}
}
这是我的另一台变压器

public class SilverTransformer implements Transformer<BusinessObject, Sliver> 
{
    @Override
    public Gold transformToState(BusinessObject input) {
        SilverBO goldbo= (SilverBO) input; // redundant casting line
        // again do some transformation with BO to make it a state with some business logic
    }
}
公共类SilverTransformer实现Transformer
{
@凌驾
public Gold transformToState(BusinessObject输入){
SilverBO goldbo=(SilverBO)输入;//冗余转换线
//再次对BO进行一些转换,使其成为具有一些业务逻辑的状态
}
}

SilverBO
GoldBO
都实现了
BusinessObject
,这是一个标记接口。和
银色
金色
扩展
状态
。我真的觉得转换很烦人而且多余。这里有更好的方法使用泛型吗?还是使用更好的模式?我不想对
状态
进行任何更改,即黄金和白银。

您也可以在输入
业务对象
上概括该界面:

public interface Transformer<I extends BusinessObject, O extends State> {
    public O transformToState(I input);
}

public class GoldTransformer implements Transformer<GoldBO, Gold> {    
    @Override
    public Gold transformToState(GoldBO input) {
        // Code...
    }
}
公共接口转换器{
公共O转换状态(I输入);
}
公共类GoldTransformer实现了Transformer{
@凌驾
公共Gold transformToState(GoldBO输入){
//代码。。。
}
}

同时将输入设置为通用:

public interface Transformer<I extends BusinessObject, O extends State> {
    public O transformToState(I input);
}

看起来BusinessObject是一个类,但您也使用了与泛型类型参数相同的标识符!在这段代码中,BusinessObject不引用您的类,它是一个独特的标识符。如果它在不同的包中,您可以通过验证它不需要导入来验证这一点

interface Transformer<BusinessObject, O extends State>
{
    public O transformToState(BusinessObject input);
}
接口转换器
{
公共O transformToState(业务对象输入);
}
这在语义上与以下内容相同:

interface Transformer<FlyingSpaghettiMonster, O extends State>
{
    public O transformToState(FlyingSpaghettiMonster input);
}
接口转换器
{
public O transformToState(FlyingsPageThetTimenster输入);
}
任何像样的IDE都会为泛型类型参数添加不同的颜色,以帮助您区分它们。请参见下文,实际类型参数为白色,而泛型类型参数为深绿色:

虽然您应该更改泛型类型参数以避免混淆,但从技术上讲,要删除强制转换,只需更改transformer实现,如下所示:

public class GoldTransformer implements Transformer<GoldBO, Gold>
{                                                 // ^ changed
    @Override
    public Gold transformToState(GoldBO input) {
                                // ^ changed
    }
}
公共类GoldTransformer实现Transformer
{/^已更改
@凌驾
公共Gold transformToState(GoldBO输入){
//^更改
}
}
但是,您也可能(或可能)希望强制第一个类型参数是BusinessObject的子类,否则可以创建一个
转换器。为此,请将界面更改为:

public interface Transformer<I extends BusinessObject, O extends State>
{
    public O transformToState(I input);
}
公共接口转换器
{
公共O转换状态(I输入);
}

其中,
I
现在是泛型类型参数,BusinessObject是一个真正的类型,它确实引用了您的类。

Gold
GoldBO
之间的关系是什么?GoldBO有一些额外的属性,而不是Gold的直接副本。根据业务逻辑,我决定哪些值应该属于Gold state。速度是真实的,+1。快速问题
BusinessObject
是一个标记接口,我的
SilverBO
实现了BusinessObject,而不是扩展了它。还能用吗?@Kid101:看修订版,在你添加评论之前4分钟我已经纠正了这个错误:)低带宽:)解释得很好+1.
interface Transformer<FlyingSpaghettiMonster, O extends State>
{
    public O transformToState(FlyingSpaghettiMonster input);
}
public class GoldTransformer implements Transformer<GoldBO, Gold>
{                                                 // ^ changed
    @Override
    public Gold transformToState(GoldBO input) {
                                // ^ changed
    }
}
public interface Transformer<I extends BusinessObject, O extends State>
{
    public O transformToState(I input);
}