2017-07-18 65 views
-1

我有这样的代码:为什么需要那么泛型类型键入reasure虽然我们可以使用对象POJO的

public class Crate<T> { 
    private T contents; 

    public T emptyCrate() { 
     return contents; 
    } 

    public void packCrate(T contents) 
    { 
     this.contents = contents; 
    } 
} 

现在我们知道 - 到底这将是“转化”成下面的代码:

public class Crate { 
    private Object contents; 

    public Object emptyCrate() { 
     return contents; 
    } 

    public void packCrate(Object contents) 
    { 
     this.contents = contents; 
    } 
} 

那么为什么我们需要创建一个泛型,如果我已经可以创建一个像Object Based类?

+0

得到答案。如果我们创建了一个对象pojo,那么在编译时的子方法被隐藏起来 –

+1

因为如果你想让你的'Crate'包含'Integer','String',无论如何,你必须将'emptyCrate()'的结果'Integer','String'或其他 - 你必须记住它包含的数据类型。 –

+1

编译器也会提示你错误,如果你试图插入错误的类型。而且不仅在运行时。泛型是程序员对类型安全的保险。在java 1.5 – JacksOnF1re

回答

0

Java中的所有集合都是泛型。这是使用泛型的最好例子。例如,您创建班级List。它将持有哪些类型的对象?当您创建List类时,您不知道它将保存哪些类型,因此您使用泛型。当你使用List班时,你说,你想把Integersnew List<Integer)。

2

你看,java代码被转换为字节码。那么,为什么你不用字节码编写程序呢?他们会翻译吗?或者,确切地说:JIT编译器会在某些时候将大部分字节码转换为机器码。那么为什么你坚持写java代码而不是二进制机器代码?

我想就上述问题使我的一点:泛型允许你表达意图为读者。它们允许你写更好的源代码;并且它们使编译器能够对您的输入进行某种检查 - 正如Andy Turner的其他答案中很好地总结的那样。

这是任何抽象编程语言提供给你整点:他们帮助程序员创建一个表示“需要做什么”中,使得它轻松了简洁的方式源代码让读者了解发生了什么,为什么

2

当人们谈论类型擦除时,他们通常关注泛型类本身。但是还有另外一个重要的地方就是通用网站。

举例来说,如果你有这样的代码:

Crate<Integer> intCrate = new Crate<>(); 
intCrate.packCrate(0); 
Integer contents = intCrate.emptyCrate(); 

然后,当被编译,它实际上就变成了:

Crate intCrate = new Crate(); 
intCrate.packCrate(0); 
Integer contents = (Integer) intCrate.emptyCrate(); 
       //^Important! This cast. 

即有自动插入转换。此外,含蓄,有检查的packCrate参数与Integer兼容,所以你不能写:

intCrate.packCrate("hello"); 

现在,你可以做到这一点没有泛型,把这些投下自己,但是编译器并不能帮助你了解Crate的内容。你可以写这样的事情:

Crate crate = new Crate(); 
crate.packCrate(0); 
String contents = (String) crate.emptyCrate(); 

这将在运行时失败,因为箱子包含Integer,而不是String

泛型只是帮助你不必记住你被允许传递给实例的内容,以及你将从中获得什么。

0

泛型中的模板参数用于编译时安全性。

Crate<Integer> cr; 
Object o; 

cr.packCrate(o); // compilation error here 

它也可以声明作为参数的任何类将实现一些方法:如果你写例如编译器会呛

Interface I { 
    void myMethod(); 
} 

class Crate<T extends I> { 
    private T contents; 
    ... 
    public void applyMethod() { 
     contents.myMethod();  // T shall implement myMethod 
    } 
} 

其实一切都可以通过显式转换来完成,但你只会产生运行时错误,而泛型允许编译时检测错误。

1

它将变成什么并不重要。

相反,编译的阶段很重要。泛型保证类型安全处于编译类型(修复编译时错误比运行时错误更容易)。

它也消除铸造并使能够实现通用算法

+0

之前完成的许多错误,但它不是“消除强制转换”,但它消除了自己编写它们的需要。 – JacksOnF1re

+0

我会说泛型* elide *施放,而不是消除它们。 –

相关问题