❶ java中如何实现泛型类和泛型类之间的继承
A1的泛型参数要有两个,否则无法确定抽象父类的泛型。
public class inher
{
public static void main(String[] args)
{
var a1 = new A1<Child, Parent>();
a1.a = new Parent();
a1.b = new Child();
a1.a.parent = 1;
a1.b.child = 2;
System.out.println(a1.a.parent);
System.out.println(a1.b.child);
}
}
abstract class A<T>
{
public T a;
}
class A1<U extends T, T> extends A<T>
{
public U b;
}
class Parent
{
public int parent;
}
class Child extends Parent
{
public int child;
}
❷ java 如何继承泛型
下面一个子类继承泛型父类的例子,可以参考一下:
//父类是一个泛型
classParent<T>{
privateTval;
publicTgetVal(){
returnval;
}
publicvoidsetVal(Tval){
this.val=val;
}
}
classChild1extendsParent<Integer>{
}
classChild2extendsParent<String>{
}
publicclassApp{
publicstaticvoidmain(String[]argv){
Child1c1=newChild1();
c1.setVal(123456);
System.out.println(c1.getVal());
Child2c2=newChild2();
c2.setVal("abcdef");
System.out.println(c2.getVal());
}
}
❸ Java 泛型和继承的区别
泛型是参数化类型,把运行时期可能产生的问题,提前到了编译时期,用来保证代码安全性!
跟继承区别?这两根本就不是一回事呢....
你非要把这两个概念整在一起,那么就有一点关联就是如果父类带有泛型:
子类有两个动作可做:1:覆盖.2:擦除
❹ java中的泛型 求详细解释
1、Java泛型
其实Java的泛型就是创建一个用类型作为参数的类。就象我们写类的方法一样,方法是这样的method(String str1,String str2 ),方法中参数str1、str2的值是可变的。而泛型也是一样的,这样写class Java_Generics<K,V>,这里边的K和V就象方法中的参数str1和str2,也是可变。下面看看例子:
//code list 1
import Java.util.Hashtable;
class TestGen0<K,V>{
public Hashtable<K,V> h=new Hashtable<K,V>();
public void put(K k, V v) {
h.put(k,v);
}
public V get(K k) {
return h.get(k);
}
public static void main(String args[]){
TestGen0<String,String> t=new TestGen0<String,String>();
t.put("key", "value");
String s=t.get("key");
System.out.println(s);
}
}
正确输出:value
这只是个例子(Java中集合框架都泛型化了,这里费了2遍事.),不过看看是不是创建一个用类型作为参数的类,参数是K,V,传入的“值”是String类型。这个类他没有特定的待处理型别,以前我们定义好了一个类,在输入输入参数有所固定,是什么型别的有要求,但是现在编写程序,完全可以不制定参数的类型,具体用的时候来确定,增加了程序的通用性,像是一个模板。
呵呵,类似C++的模板(类似)。
1.1. 泛型通配符
下面我们先看看这些程序:
//Code list 2
void TestGen0Medthod1(List l) {
for (Object o : l)
System.out.println(o);
}
看看这个方法有没有异议,这个方法会通过编译的,假如你传入String,就是这样List<String>。
接着我们调用它,问题就出现了,我们将一个List<String>当作List传给了方法,JVM会给我们一个警告,说这个破坏了类型安全,因为从List中返回的都是Object类型的,而让我们再看看下面的方法。
//Code list 3
void TestGen0Medthod1(List<String> l) {
for (Object o : l)
System.out.println(o);
}
因为这里的List<String>不是List<Object>的子类,不是String与Object的关系,就是说List<String>不隶属于list<Object>,他们不是继承关系,所以是不行的,这里的extends是表示限制的。
类型通配符是很神奇的,List<?>这个你能为他做什么呢?怎么都是“?”,它似乎不确定,他总不能返回一个?作为类型的数据吧,是啊他是不会返回一个“?”来问程序员的?JVM会做简单的思考的,看看代码吧,更直观些。
//code list 4
List<String> l1 = new ArrayList<String>();
li.add(“String”);
List<?> l2 = l1;
System.out.println(l1.get(0));
这段代码没问题的,l1.get(0)将返回一个Object。
1.2. 编写泛型类要注意:
1) 在定义一个泛型类的时候,在 “<>”之间定义形式类型参数,例如:“class TestGen<K,V>”,其中“K” , “V”不代表值,而是表示类型。
2) 实例化泛型对象的时候,一定要在类名后面指定类型参数的值(类型),一共要有两次书写。例如:
TestGen<String,String> t=new TestGen<String,String>();
3) 泛型中<K extends Object>,extends并不代表继承,它是类型范围限制。
2、泛型与数据类型转换
2.1. 消除类型转换
上面的例子大家看到什么了,数据类型转换的代码不见了。在以前我们经常要书写以下代码,如:
//code list 5
import Java.util.Hashtable;
class Test {
public static void main(String[] args) {
Hashtable h = new Hashtable();
h.put("key", "value");
String s = (String)h.get("key");
System.out.println(s);
}
}
这个我们做了类型转换,是不是感觉很烦的,并且强制类型转换会带来潜在的危险,系统可能会抛一个ClassCastException异常信息。在JDK5.0中我们完全可以这么做,如:
//code list 6
import Java.util.Hashtable;
class Test {
public static void main(String[] args) {
Hashtable<String,Integer> h = new Hashtable<String,Integer> ();
h.put("key", new Integer(123));
int s = h.get("key").intValue();
System.out.println(s);
}
}
这里我们使用泛化版本的HashMap,这样就不用我们来编写类型转换的代码了,类型转换的过程交给编译器来处理,是不是很方便,而且很安全。上面是String映射到String,也可以将Integer映射为String,只要写成HashTable<Integer,String> h=new HashTable<Integer,String>();h.get(new Integer(0))返回value。果然很方便。
❺ java继承为什么不能代替泛型
Java继承和泛型是两个不同的概念,它们之间没有直接的替代关系。
继承是面向对象编程中的一个重要特性,它允许一个类继承另一个类的属性和方法。通过继承,子类可以重用父类的代码并添加自己的特定功能。继承是一种静态结构,编译器在编译时就可以确定类型之间的继承关系。
泛型是Java 5引入的一个功能,它允源高许开发人员编写可以处理多种类型的通用代码。泛型是一种动态结构,编译器在编译时不会确定具体的类型,而是在运行时根据传入的参数类型进行类型擦除并生成相应的字节码。
虽然继承和泛型都可以用来实现代码重用和灵活性,但继承只能在编译时确定类型,而泛型可以在运行时根据实际类型进行类型擦除。因此,泛型更适合于处理多态性和动态类型的情况,而继承更适合于处理静态类型之间的关系。
因此,继承不巧答能代替泛型孝裂慧,它们各自有其适用的场景和优势。在实际开发中,开发人员需要根据具体的需求和情况选择合适的编程方式和技术。
❻ java中为何泛型类不能继承Throwable
意义,
异常发生在底层实现,
捕获异常在上层。
泛型做好,用于使用某个类的时候限制相关类型。
显然限制相关类型这个工作应该是哪里用哪里直到。
如果异常支持泛型,
那捕获异常的地方就要知道异常的泛型,也就必要知道了功能实现。
假设可以抛出有泛型的异常
如果说一个方法被声明为 throws SomeException<String>,SomeException<Number>
那么对于外界来说String的意义是什么
外界是否要捕获 分别SomeException<String> 和 SomeException<Number>?
还是只要捕获 SomeException<?>?
这无疑增加了异常处理的复杂度。
异常,最初设计就是为了把异常处理的代码和业务逻辑的代码分开,不会粘粘到一起。
这橘档样可以在写业务逻辑的时候抛开泛型暂时不管,先把完整的业务逻辑写完,然后单独处理异常情况。
现在如果异常支持泛型,那么就会导致异常处理的复杂度增加。不能专心与纯伍铅业务逻辑。
❼ Java泛型 继承接口相关问题
当然正确。
FifoCache是一个泛型类,V由在创建此类的实例时指定具体类型,再传给接口中的V,而接口interface Cache<K,V>中的K已显式指定为String类型。因此,在创建此类的实例时,接口interface Cache<K,V>中的K,V都已指定了具体的类型,当然正确。
❽ java中接口具有泛型,继承的时候该怎么处理
大部分java离得接口好像都是泛型吧?
class test implements 接口<对象(例如String,Integer等等)>