代码之家  ›  专栏  ›  技术社区  ›  Kid101

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

  •  3
  • Kid101  · 技术社区  · 7 年前

    下面是我的变压器接口

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

    这是我的变压器之一IMPL

    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
        }
    }
    

    这是我的另一个变压器IMPL

    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
        }
    }
    

    两个 SilverBO GoldBO 器具 BusinessObject 这是一个标记接口。和 Silver Gold 延伸 State . 我真的觉得演员阵容很烦人和多余,有没有更好的方法来使用仿制药?或者使用更好的模式?我不想对 state 即金银。

    3 回复  |  直到 7 年前
        1
  •  5
  •   Mureinik    7 年前

    您可以归纳输入上的接口 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...
        }
    }
    
        2
  •  2
  •   Michael    7 年前

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

    Interface Transformer<BusinessObject,o extends state>
    {
    public o transformtoState(BusinessObject输入);
    }
    < /代码> 
    
    

    这在语义上是相同的

    Interface Transformer<flyingsPaghitTimonster,o extends state>
    {
    公共O TransformtoState(FlyingsPaghettoManster输入);
    }
    < /代码> 
    
    

    任何合适的IDE都会对通用类型参数进行不同的着色,以帮助区分它们。请参见下面,实际类型参数为白色,而常规类型参数为深绿色:

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

    public class gold transformer implements transformer<goldbo,gold>
    /^已更改
    @重写
    公共黄金转换状态(goldbo输入){
    //^改变
    }
    }
    < /代码> 
    
    

    但是,您也可能(或可能)希望强制第一个类型参数是BusinessObject的子类,否则将可能创建一个transformer<string,gold>。要执行此操作,请将接口更改为:

    public interface transformer<i extends businessobject,o extends state>
    {
    公共O转换状态(I输入);
    }
    < /代码> 
    
    

    其中,iis now the generic type parameter and businessobject is a real type which do refer to your class.

    唯一标识符。如果它在不同的包中,您可以通过验证它是否不需要导入来验证这一点。

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

    这是语义相同到:

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

    任何合适的IDE都会对通用类型参数进行不同的着色,以帮助区分它们。如下所示,实际类型参数为白色,而一般类型参数为深绿色:

    generic type parameter highlighting in IntelliJ IDEA

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

    public class GoldTransformer implements Transformer<GoldBO, Gold>
    {                                                 // ^ changed
        @Override
        public Gold transformToState(GoldBO input) {
                                    // ^ changed
        }
    }
    

    然而,这是可能的(或可能的)您还需要强制第一个类型参数是BusinessObject的子类,否则可以创建Transformer<String, Gold>. 要执行此操作,请将接口更改为:

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

    在哪里?I现在是泛型类型参数,BusinessObject是一个真正的类型,它确实引用了类。

        3
  •  1
  •   Nikolas Charalambidis    7 年前

    使输入成为通用的:

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

    银的例子:

    public class SilverTransformer implements Transformer<SilverBO, Silver> {    
    
        @Override
        public Silver transformToState(SilverBO input) {
             return new Silver(input); // an example, perform the transformation...
        }   
    }
    

    Java 8给出了更短的方法

    或者,如果使用Java 8或更高版本,则 Transformer<BusinessObject, O extends State> 和…完全一样 java.util.Function<BusinessObject, O extends State> . 因此不需要接口。用法非常简单:

    Function<SilverBO, Silver> silverTransformer = (input -> new Silver(input));
    Silver silver = silverTransformer.apply(silverBo);
    

    直接在lambda表达式内部执行转换。如果转换需要更多的行,请使用括号 {} return .

    Function<SilverBO, Silver> silverTransformer = (input -> {
        Silver output = // transformation ... 
        // ... more transformation ...
        return output;
    });