Java泛型&;返回类型

Java泛型&;返回类型,java,generics,Java,Generics,我很好奇如何不强制转换就从函数返回泛型数据类型。似乎泛型的全部目的是消除对集合进行强制转换的需要以及由此产生的编译时错误 然而,用一种说这个签名的方法: public E get( K key ) 如果不执行另一个类型的转换,我无法返回类型E,例如return(E)“test” 这不是违背了使用泛型的全部目的吗?我错过了什么。如何返回类型为E的变量?泛型用于在“模板”中指定的对象类与类或方法本身提供的功能无关或几乎无关时,提高类和/或方法的再利用率 最好的例子是数据结构,其中泛型类型是黑框。你

我很好奇如何不强制转换就从函数返回泛型数据类型。似乎泛型的全部目的是消除对集合进行强制转换的需要以及由此产生的编译时错误

然而,用一种说这个签名的方法:

public E get( K key )
如果不执行另一个类型的转换,我无法返回类型E,例如
return(E)“test”


这不是违背了使用泛型的全部目的吗?我错过了什么。如何返回类型为E的变量?

泛型用于在“模板”中指定的对象类与类或方法本身提供的功能无关或几乎无关时,提高类和/或方法的再利用率

最好的例子是数据结构,其中泛型类型是黑框。你不关心它们,只是以某种方式聚合它们,重要的是你如何索引、排序、查找、遍历,。。。这个物体

您提出的案例(
return(E)“test”
)违背了这一原则,因为您正在构建其中一个对象,为此您需要了解它的类详细信息

假设您想提供一个类来表示对象对。您根本不关心这些对象的性质,您只想提供一种分组到对象引用的方法。这是使用泛型类型的典型情况:

public class  Pair<T,S> {

    public T getFirst() {
        return first;
    }

    public void setFirst(T first) {
        this.first = first;
    }

    public S getSecond() {
        return second;
    }

    public void setSecond(S second) {
        this.second = second;
    }

    private T first;
    private S second;
}
公共类对{
公共T getFirst(){
先返回;
}
公共无效设置优先(T优先){
this.first=first;
}
公共S getSecond(){
返回第二;
}
公共空间设置秒(秒){
这个秒=秒;
}
私人T优先;
第二,私营企业;
}

除了聚合它们之外,Pair与
第一个
第二个
无关

是的,您可以使用泛型。下面是一个示例代码:

public class Sample<E,K>{
Map<K, E> map = new HashMap(){{
    put("key", "value");
}};
public static void main(String[] args) {
    Sample<String,String> sample = new Sample<String,String>();
    String val = sample.get("key");
    System.out.println(val);
}

public  E get( K key ) {
    E e = map.get(key);
    return e;

}
}
公共类示例{
Map Map=newhashmap(){{
put(“键”、“值”);
}};
公共静态void main(字符串[]args){
样本=新样本();
字符串val=sample.get(“key”);
系统输出打印项次(val);
}
公共E-get(K键){
E=map.get(键);
返回e;
}
}

是您可以返回类型E而不强制转换,例如a
Map
返回Map.get(key)。无论从何处使用此函数,其类型都将在编译时已知,并且返回类型将自动设置为E。如果在返回字符串之前将字符串强制转换为E,则您的类不应是泛型的,因为它只能返回字符串。