坚持使用Java通用类

时间:2014-09-29 09:01:42

标签: java generics

我有一项任务,我被困住了。赋值是为此方法编写泛型类:

public static void main(String[] args) {
    ValueStore<Object> myStore1 = new ValueStore<Object>(); 
    myStore1.set("Test"); 
    myStore1.get();

   ///
    ValueStore<Object> myStore2 = new ValueStore<Object>(); 
    myStore2.set(myStore1); 
    myStore1 = myStore2.get(); 
}

我到目前为止。

public class ValueStore<T> {
    private T x;

    public void set(T x) {
        System.out.println(x);
    }

    public T get () {
        return x;
    }
}

我可以打印mystore.set“test”,但不能打印myStore2.set。而且我不明白为什么我的老师将参考变量作为参数传递。当我这样做时,我在控制台中获得ValueStore @ 15db9742。或许这就是重点?

有人可以解释为什么它会说myStore2.set(myStore1); myStore1 = myStore2.get(),它应该打印什么以及它背后的逻辑?

提前谢谢你。对不起,如果我的文字很乱。第一次来这里。

2 个答案:

答案 0 :(得分:2)

我认为目前您只是遗漏了set()方法中的一行,如

public void set(T x) {
    System.out.println(x);
    this.x = x;
}

这样你就可以存储对象。

答案 1 :(得分:0)

我已经评论了一些解释。重点是您可以为ValueStore提供类型(在此示例中为String)。这使得类型系统意识到当您在get()上调用valuestore时,它会获得string作为回报。这实际上是仿制药的全部要点。如果您只是放object,只有您知道get方法将返回String,因此您必须将其强制转换(如第二个示例中所示)。

public static void main(String[] args) {
    // Type your store with String, which is what generics is about.
    ValueStore<String> myStore1 = new ValueStore<String>(); 

    // Store a string in it.
    myStore1.set("Test");
    // Get the object, and the typesystem will tell you it's a string so you can print it.
    System.out.println(myStore1.get());

   ///
    ValueStore<Object> myStore2 = new ValueStore<Object>(); 
    // Store your store.
    myStore2.set(myStore1); 
    // The type system only knows this will return an Object class, as defined above.
    // So you cast it (because you know better).
    myStore1 = (ValueStore<String>) myStore2.get(); 
    System.out.println(myStore1.get());
}

public class ValueStore<T> {
    private T x;

    public void set(T x) {
        this.x = x;
    }

    public T get () {
        return x;
    }
}

此代码打印以下内容:

test
test