我定义了一个包含泛型的接口,接口中有若干方法,都是依赖于泛型
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> 中的类型,请问我该怎么做?
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> 中的类型,请问我该怎么做?
private MayService<U> myService;
/**
* 定义一个构造函数,将MayService的实现类传入
* @param myService
*/
public MyClass(MayService<U> myService) {
this.myService = myService;
}
}
有两种方法来满足你的要求,
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));
}
}
比如我这样定义MyService<SerObj> service ;//假设这是一个实例化了的对象
new MyClass<String>(service);我希望在泛型定义的时候就强制他们使用同一个具体类型,所以我希望在MyClass中能继承MyService的泛型。
}
这种方式可以保证U是T的子类,但是需要你在外面实例化的时候传入父类T
比如我这样定义MyService<SerObj> service ;//假设这是一个实例化了的对象
new MyClass<String>(service);我希望在泛型定义的时候就强制他们使用同一个具体类型,所以我希望在MyClass中能继承MyService的泛型。
你可以使用你的假设去测试一下方法一, 编译是不会通过的, MyService和MyClass的类型必须一至才可以的.
public class MyClass<T extends Serializable>