Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这是普通的自动包装吗?_Java_Generics_Autoboxing - Fatal编程技术网

Java 这是普通的自动包装吗?

Java 这是普通的自动包装吗?,java,generics,autoboxing,Java,Generics,Autoboxing,在不使用诸如“this.getAnything(int标志)”之类的常用符号的情况下赋值 private T getAnything(int标志){ 对象o=null; 如果(标志==0) o=新字符串(“新字符串”); else if(标志==1) o=新的双圈(0D); 返回(T)o; } 私有方法(){ 字符串s=getAnything(0); 双d=getAnything(1); } 在过去,在方法上只有一个返回对象,在接收类型上只有一个简单的强制转换就足够了,因此由于在接收方对象上没

在不使用诸如“this.getAnything(int标志)”之类的常用符号的情况下赋值

private T getAnything(int标志){
对象o=null;
如果(标志==0)
o=新字符串(“新字符串”);
else if(标志==1)
o=新的双圈(0D);
返回(T)o;
}
私有方法(){
字符串s=getAnything(0);
双d=getAnything(1);
}
在过去,在方法上只有一个返回对象,在接收类型上只有一个简单的强制转换就足够了,因此由于在接收方对象上没有通用的表示法,所以写起来更相似,也更快速,关于类型安全还有其他提示吗?

不清楚您试图做什么,但应该指出的是,您的代码中没有任何类型安全性

Double d = getAnything(0);
// compiles fine, but throws ClassCastException at run time
这首先违背了使用泛型的目的

您在撰写此声明时引入了这种不安全性:

return (T)o; // warning: Type safety: Unchecked cast from Object to T
相关问题
另见
  • 有效Java第二版,第24项:消除未检查的警告

论类型安全异构容器 也许您需要类似Josh Bloch所称的类型安全异构容器。以下是Neal Gafter博客中的一段话:

下面是一个简单但完整的API示例,该API在 THC模式,摘自Josh 2006年的JavaOne演讲:

public class Favorites {

    private Map<Class<?>, Object> favorites =
        new HashMap<Class<?>, Object>();

    public <T> void setFavorite(Class<T> klass, T thing) {
        favorites.put(klass, thing);
    }
    public <T> T getFavorite(Class<T> klass) {
        return klass.cast(favorites.get(klass));
    }

    public static void main(String[] args) {
        Favorites f = new Favorites();
        f.setFavorite(String.class, "Java");
        f.setFavorite(Integer.class, 0xcafebabe);

        String s = f.getFavorite(String.class);
        int i = f.getFavorite(Integer.class);
    }
}
公共类收藏夹{
私有映射,对象>();
公共空间设置收藏夹(类klass,T thing){
收藏。放(克拉斯,东西);
}
公共T-getFavorite(klass类){
返回klass.cast(favorites.get(klass));
}
公共静态void main(字符串[]args){
收藏夹f=新收藏夹();
f、 setFavorite(String.class,“Java”);
f、 setFavorite(Integer.class,0xcafebabe);
String s=f.getFavorite(String.class);
inti=f.getFavorite(Integer.class);
}
}
使用此模式,您可以获得类型安全性
inti=f.getFavorite(String.class)不编译(这是一件好事!)

另见
  • 有效java第二版,项目29:考虑类型化异构容器

论自动装箱 自动装箱是从say基元
int
到引用类型
Integer
的隐式转换;自动取消装箱是相反的转换。上述问题与自动装箱无关

另见
相关问题
  • (是的!!!)
  • (不!!!)
  • (是的,很不幸)

我想你把自动装箱和类型推断混淆了

类型推断是指编译器可以根据调用泛型方法时使用的变量,自行判断泛型方法应使用的类型

例如,如果您有以下方法:

public <T extends SomeClass> T process(T obj) {
    // call some methods of SomeClass on obj to process it here
    return obj;
}
推断的类型将是SomeChildClass

可以从参数或返回类型推断类型,如示例中所示。但是编译器并不总是清楚它应该使用什么类型。如果发生这种情况,您可以使用您描述的方法
this.getAnything(int flag)
强制输入。这种情况通常发生在以下情况:

public <T> List<T> getSomeList() {
    // implementation
}

public void processList(List<SomeClass> list) {
     // implementation
}
public List getSomeList(){
//实施
}
公共作废处理列表(列表){
//实施
}
和呼唤

processList(getSomeList()); // compiler error: cannot convert List<Object> to List<SomeClass>
processList(getSomeList());//编译器错误:无法将列表转换为列表
在这种情况下,可能需要强制输入type参数


尽管如此,请考虑Polygene所说的一切,因为他对您的代码提出了一些非常好的观点,并解释了什么是自动装箱(它与Integer for int和Double for Double等原始包装类相关)。

我看不出自动装箱与此代码有什么关系。如果你能对此发表评论,我可以详细阐述,希望能澄清任何混淆。你永远不要在Java中使用
newstring(“hello”)
。只需写下“你好”
——这已经是一个
字符串
对象了。无需创建另一个
字符串
对象。
public <T> List<T> getSomeList() {
    // implementation
}

public void processList(List<SomeClass> list) {
     // implementation
}
processList(getSomeList()); // compiler error: cannot convert List<Object> to List<SomeClass>