我定义了一个包含泛型的接口,接口中有若干方法,都是依赖于泛型
public interface MyService<T extends Serializable> { public List<T> loadData();    .   .......}
 
紧接着我又定义了一个类,我不希望这个类是实现接口的,而只是使用该接口
public class MyClass{
private MayService<T> myService;

/**
 * 定义一个构造函数,将MayService的实现类传入
 * @param myService  

 */
public MyClass(MayService<T> myService) {
this.batchService = batchService;

}

}
这样写是不能通过编译的.我希望能通过构造函数或者是其他方式来告诉编译器,<T>是使用MayService<T> 中的类型,请问我该怎么做?

解决方案 »

  1.   

    public class MyClass<U>{
         
     
        private MayService<U> myService;
         
        /**
         * 定义一个构造函数,将MayService的实现类传入
         * @param myService  
         
         */
        public MyClass(MayService<U> myService) {
            this.myService = myService;
             
        }
         
    }
      

  2.   

    泛型最终使用的时候(实例化时)必须明确类型.
    有两种方法来满足你的要求,
    1. 如果MyClass作为公共类供其它类调用. 可以将MyClass改为MyClass<T extends Serializable>
    2. 如果MyClass是最终调用类, 那么此时的T必须明确类型, 事实上在使用的MayService的时候是知道类型的, 此时将private MayService<T> myService; 定义为private MayService<明确类型> myService;测试类: 接口
    public interface MyService<T extends Serializable> {    List<T> loadData();
    }实体
    public class SerObj implements Serializable {}
    方法1:class public class  MyClass<T extends Serializable> {
        private MyService<T> myService;    public  MyClass(MyService<T> myService) {
            this.myService = myService;
        }    // TEST
        public static void main(String[] args) {
            new  MyClass<SerObj>(() -> new ArrayList<>(10)); // 实例化时指定类型
        }
    }方法2:
    public class MyClass {
        private MyService<SerObj> myService; // 定义时指定类型    public MyClass(MyService<SerObj> myService) {
            this.myService = myService;
        }    public static void main(String[] args) {
            new MyClass(() -> new ArrayList<>(10));
        }
    }
      

  3.   

    感谢回复,若按方法一,MyClass<T> 和MyService<T> 最终传入的具体类型可能不一致。
    比如我这样定义MyService<SerObj> service ;//假设这是一个实例化了的对象
    new MyClass<String>(service);我希望在泛型定义的时候就强制他们使用同一个具体类型,所以我希望在MyClass中能继承MyService的泛型。
      

  4.   

    public class MyClass<T,U extends T>{
    }
    这种方式可以保证U是T的子类,但是需要你在外面实例化的时候传入父类T
      

  5.   

    感谢回复,若按方法一,MyClass<T> 和MyService<T> 最终传入的具体类型可能不一致。
    比如我这样定义MyService<SerObj> service ;//假设这是一个实例化了的对象
    new MyClass<String>(service);我希望在泛型定义的时候就强制他们使用同一个具体类型,所以我希望在MyClass中能继承MyService的泛型。
    你可以使用你的假设去测试一下方法一, 编译是不会通过的, MyService和MyClass的类型必须一至才可以的.
      

  6.   


    public class MyClass<T extends Serializable>