【问题标题】:java generics and SuppressWarningsjava泛型和SuppressWarnings
【发布时间】:2010-01-13 12:17:41
【问题描述】:

我有课

abstract class A {
    //....
}

class B extends A {
    //....
}

class C extends A {
    //....
}

那我有

interface Maker<T extends A> {
    SomeClass make(T obj);
}

Maker 类的实现

class MakerForB implements Maker<B> { /*... */ }
class MakerForC implements Maker<C> { /*... */ }

和类工厂用一个静态方法

class Factory {
    public static SomeClass makeSomeClass(A obj) {
        Maker maker = null;
        if(obj instanceof B) maker = new MakerForB();
        /* ... */
        return maker.make(obj);
    }
}

在这种情况下,当我以这种方式声明 Maker 时,我会收到 Maker 是原始类型的警告

Maker<?> maker = null;

我得到异常(make不适用于参数A)

return maker.make(obj);

使用

消除这些警告的最佳方法是什么
@SuppressWarnings("unchecked")

【问题讨论】:

    标签: java generics warnings static-methods


    【解决方案1】:

    摆脱 Maker 上的所有泛型 - 你不需要它:

    interface Maker {
        SomeClass make(A obj);
    }
    
    class MakerForB implements Maker {
        SomeClass make(A obj);
    }
    

    或者,如果您仍想使用它,请使用不安全的演员表或 SuppressWarnings

    如果您尝试定义,要了解为什么会出现错误:

    Maker<? extends A> maker = null;
    

    想象一下当您(偶然)得到maker = new MakerForC() 的情况,并尝试将其应用于B

    【讨论】:

    • 好的,我想我会使用 suppressWarnings 然后导致真的想避免投射
    【解决方案2】:

    如果我理解你的问题,我想你可以尝试替换

    class Factory {
        public static SomeClass makeSomeClass(A obj) {
            Maker maker = null;
            if(obj instanceof B) maker = new MakerForB();
            /* ... */
            return maker.make(obj);
        }
    }
    

    通过

    class Factory<S extends A> {
        public static SomeClass makeSomeClass(S obj) {
            Maker<S> maker = null;
            if(obj instanceof B) maker = new MakerForB();
            /* ... */
            return maker.make(obj);
        }
    }
    

    没有测试,所以如果你现在遇到其他错误,请告诉我。

    【讨论】:

    • 这不起作用。该方法是静态的。如果在方法上定义了类型 S,它仍然不起作用。
    • 在这种情况下,我无法对非静态类型 S 进行静态引用
    • 啊,是的,我明白了......所以也许一个解决方案是实现单例模式而不是使用静态方法?
    猜你喜欢
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多