Java泛型自有界类型

时间:2018-03-12 06:38:40

标签: java generics compiler-warnings

考虑下面的示例,避免下面未经检查的转换警告的好方法是什么? 用户名是

  1. 表示通用状态机的接口
  2. 每个statemachine实现都需要一个服务,运行相应的状态机时需要一组工具。
  3. 一种默认服务,提供跨州机器的公共服务
  4. 事务(txn)状态和服务的绑定。
  5. import java.util.function.Consumer;
    public class GenericsTest {
      public static void main(String[] args) {
        AService service = new AService("Aservice");
        new Txn<>(service).next();
        new Txn<>(new DefaultState()).next();
      }
    }
    // ----------------------------------------------------------- //
    interface Service {
      String getName();
      <T extends Service> State<T> getState();// this is unclear how to use generics here
    }
    interface State<T extends Service> {
      Consumer<Txn<T>> getFunction();
      int getN();
    }
    // ----------------------------------------------------------- //
    class Txn<T extends Service> {
      private T service;
      private State<T> current;
      Txn(State<T> current) {
        this.current = current;
      }
      Txn(T service) {
        this.service = service;
        this.current = this.service.getState();
      }
      int next() {
        do {
          current.getFunction().accept(this);
        } while (current.getN()>0);
        return current.getN();
      }
      public State<T> getCurrent() {
        return current;
      }
      public void setCurrent(State<T> current) {
        this.current = current;
      }
    }
    // ----------------------------------------------------------- //
    abstract class DefaultService implements Service {
      private String name;
      public DefaultService(String name) {
        this.name = name;
      }
      public String getName(){
        return this.name.toUpperCase();
      }
    }
    class AService extends DefaultService implements Service {
      public AService(String name) {
        super(name);
      }
      @Override
      public State<AService> getState() {
        return new AState(6);
      }
    }
    // ----------------------------------------------------------- //
    class DefaultState implements State<DefaultService> {
      @Override
      public Consumer<Txn<DefaultService>> getFunction() {
        return (txn) -> System.out.println("hurray now left is to do default at "+txn.getCurrent().getN());
      }
      @Override
      public int getN() {
        return 0;
      }
    }
    class AState implements State<AService> {
      private int n;
      AState(int n) {
        this.n = n;
      }
      @Override
      public int getN() {
        return n;
      }
      @Override
      public Consumer<Txn<AService>> getFunction() {
        return (txn) -> {
          int n = txn.getCurrent().getN();
          System.out.println(n);
          txn.setCurrent(new AState(--n));
        };
      }
    }
    

1 个答案:

答案 0 :(得分:-1)

基本上请编程到接口(下面列出的4个更改):

  1. DefaultService已实施Service
  2. State<AService>更改为State<Service>
  3. class AState implements State<Service>
  4. 编程到接口:class Txn<T extends Service> {
  5. 更正后的代码:

    import java.util.function.Consumer;
    public class GenericsTest {
        AService service = new AService("Aservice");
        new Txn<>(service).next();
        new Txn<>(new DefaultState()).next();
      }
    }
    
    // ----------------------------------------------------------- //
    interface Service {
      String getName();
      <T extends Service> State<T> getState();// this is unclear how to use generics here
    }
    
    interface State<T extends Service> {
      Consumer<Txn<T>> getFunction();
      int getN();
    }
    
    
    // ----------------------------------------------------------- //
    class Txn<T extends Service> {
      private T service;
      private State<T> current;
      Txn(State<T> current) {
        this.current = current;
      }
      Txn(T service) {
        this.service = service;
        this.current = this.service.getState();
      }
      int next() {
        do {
          current.getFunction().accept(this);
        } while (current.getN()>0);
        return current.getN();
      }
      public State<T> getCurrent() {
        return current;
      }
      public void setCurrent(State<T> current) {
        this.current = current;
      }
    }
    
    // ----------------------------------------------------------- //
    abstract class DefaultService implements Service {
      private String name;
      public DefaultService(String name) {
        this.name = name;
      }
      public String getName(){
        return this.name.toUpperCase();
      }
    }
    
    class AService extends DefaultService {
      public AService(String name) {
        super(name);
      }
      @Override
      public State<Service> getState() {
        return new AState(6);
      }
    }
    
    // ----------------------------------------------------------- //
    class DefaultState implements State<DefaultService> {
      @Override
      public Consumer<Txn<DefaultService>> getFunction() {
        return (txn) -> System.out.println("hurray now left is to do default at "+txn.getCurrent().getN());
      }
      @Override
      public int getN() {
        return 0;
      }
    }
    
    class AState implements State<Service> {
      private int n;
      AState(int n) {
        this.n = n;
      }
      @Override
      public int getN() {
        return n;
      }
      @Override
      public Consumer<Txn<Service>> getFunction() {
        return (txn) -> {
          int n = txn.getCurrent().getN();
          System.out.println(n);
          txn.setCurrent(new AState(--n));
        };
      }
    }