- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
{ public void addObs(O o); public vo-6ren">
我有 2 个接口(interface) Sub
和 Obs
如下图所示:
public interface Sub<O extends Obs<? extends Sub>>{
public void addObs(O o);
public void removeObs(O o);
public void notifyObs();
}
public interface Obs<S entends Sub<?>>{
public void update(S s);
}
现在有 2 个以上的具体实现,类 Vie
实现了 Obs
和类 Mod
实现了 Sub
如下:
public class Mod implements Sub<Vie<Mod>>{
private Vie<Mod>[] vies = new Vie<Mod>[0];//Here is the error.
public void addObs(Vie<Mod> vie){
vies = addToArray(vies, vie);
//Some other code;
}
public void removeObs(Vie<Mod> vie){
vies = removeFromArray(vies, vie);
//Some other code;
}
public void notifyObs(){
for(Vie<Mod> v : this.vies){
v.update(this);
}
}
}
public class Vie<M extends Mod> implements Obs<M>{
private M mod;
public void update(M){
//some code;
}
public void setMod(M mod){
this.mod.removeObs(this); //Here is the error.
mod.addObs(this); //Here is the error.
this.mod = mod;
}
}
在上面的Mod
代码中,存在数组vies
初始化错误。适用的更正是:
@SuppressWarnings("unchecked")
private Vie<Mod>[] vies = (Vie<Mod>[])new Vie<Mod>[0];
对于 Vie
类的 setMod
方法,可以应用的更正是:
@SuppressWarnings("unchecked")
public void setMod(M mod){
this.mod.removeObs((Vie<Mod>)this);
mod.addObs((Vie<Mod>)this);
this.mod = mod;
}
正如我们所看到的,在上述两种情况下,我们都必须在实例可以被程序使用之前对其进行显式类型转换,我们还必须添加 @SuppressWarnings("unchecked")
以便编译器不会抛出任何编译错误。
现在我对@SuppressWarnings("unchecked")
的理解是,我明确要求编译器不要在编译时检查变量实例的类型。如果这是正确的,那么我可以遇到任何运行时 ClassCastException
吗?
也可以修改上面的代码,这样我就不需要任何@SuppressWarnings("unchecked")
了吗?
附加信息
我更新了代码以显示变量 vies
的使用情况。以上是观察者模式的基本实现。请注意,就观察者模式而言,这是完整的实现。我的意思是说在实际实现中,真正的类继承了其他类和接口(interface),这里没有提到它们的方法。但就 vies
和 mod
变量而言,这是完整的。
最佳答案
创建参数化类型数组的问题与数组无法像数组通常那样检查添加的元素是否为正确类型有关。由于您只在类内部使用数组而不将其暴露给外部,所以没关系,您可以只抑制警告。您使用的类型和警告的抑制是类的内部实现细节,外部代码不关心。
传递的类型不匹配this
至 removes()
和 addObs
是一个更大的问题。 Vie<M>
和 Vie<Mod>
是不兼容的类型。不清楚你为什么有 Vie
是通用的。如果您不将其设为通用,它会起作用:
public class Mod implements Sub<Vie> {
private Vie[] vies = new Vie[0];
public void addObs(Vie vie) {
//vies = addToArray(vies, vie);
//Some other code;
}
public void removeObs(Vie vie) {
//vies = removeFromArray(vies, vie);
//Some other code;
}
public void notifyObs() {
for (Vie v : this.vies) {
v.update(this);
}
}
}
public class Vie implements Obs<Mod> {
private Mod mod;
public void update(Mod mod) {
//some code;
}
public void setMod(Mod mod) {
this.mod.removeObs(this);
mod.addObs(this);
this.mod = mod;
}
}
如果您希望此代码适用于 Mod
和 Vie
子类,那么它会更复杂。
关于java - 使用 @SuppressWarnings ("unchecked"转换 Java 泛型是否会导致运行时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30296364/
这个问题已经有答案了: @SuppressWarnings("serial") (2 个回答) 已关闭 6 年前。 为什么使用注释:@SuppressWarnings("serial") 在带有 Sp
当我查看SuppressWarnings.java时,我看到这个注解的参数限制是String[],但是为什么我们通常会这样写呢? (例如:@SuppressWarnings({"ratypes", "
我现在多次遇到这个问题,并且总是通过一些强制转换和 @SuppressWarnings 来解决这个问题。注释。 相关接口(interface)/抽象类: public abstract class D
我正在使用一个名为 Weka 的开源 Java 库在 Eclipse Indigo 项目中。该库似乎有点过时,因此 Eclipse 向我显示了数千条有关其代码的警告。一个典型的例子是: ArrayLi
哪个参数 @SuppressWarnings 用于隐藏 Warning(209.56):静态变量应该由类型名称 javax.swing.ListSelectionModel 而非表达式限定? 最佳答案
假设我有一个生成警告的注解。注释在方法上。 例如 @AnnotationThatGeneratesAWarning public void doSomething() { //stuff } 我可
我有以下代码 ParameterExpression[] searchStrings = new ParameterExpression[10]; 这有效,但会发出警告,指出我正在执行“未经检查”操作
我有一个返回值的静态方法 Magic Constant .每次我访问我的代码中的方法时,我都会收到这样的警告: Must be one of: Toast.LENGTH_SHORT, Toast.LE
我很困惑@SuppressWarnings 是如何在内部工作的。如果我们看到它的源代码,它是这样的: @Retention(SOURCE) @Target({TYPE, FIELD, METHOD,
在某个地方,我有一个带有通用“VT extends String”的方法。显然这会产生一个警告:类型参数 VT 不应受最终类型 String 的限制。 Final 类型无法进一步扩展。 您知道是否有办
有没有一种方法可以避免使用下面的 @SuppressWarnings 并在没有警告的情况下保持相同的功能 'Type safety: Unchecked cast from AbstractDO[]
为了试验 @SuppressWarnings 注解,我编写了以下示例程序: public class Test { public static void main(String[] args)
@SuppressWarnings 注释用于更简洁的代码,或者添加它是否有任何性能提升或优势? 或者我们可以通过这样做来减少编译时间。 最佳答案 @SuppressWarnings 注释类型允许 Ja
我有课 abstract class A { //.... } class B extends A { //.... } class C extends A { //....
我目前有一个枚举,它有一个可以接受 null 并包含以下 SuppressWarning 注释的构造函数: @SuppressWarnings("all") public enum TheEnum {
我有一个问题,因为我有点困惑(或者我没有注意到一些明显的事情)。假设我有一些包含很多类的源代码,这些类包含大量像这样定义的静态字段: public final class ConverterTYPE
Java 中的 @SuppressWarnings 注解指示被该注解修饰的程序元素(以及该程序元素中的所有子元素)取消显示指定的编译器警告,且会一直作用于该程序元素的所有子元素。例如,使用 @Supp
我将 Eclipse 配置为在缺少公共(public)元素的 javadoc 注释和标签时显示警告。这对我来说非常有用,可以很好地记录我的代码。 但有时我有一个类,我有几个常量描述例如 DFA 的状态
我有一个用于将对象持久保存到磁盘的 Cache 对象,我实现它的方式导致我不得不使用 @SupressWarnings 。我不是 Java 专家,但这似乎是一种代码异味,我想知道是否有“更好”的方法来
我正在尝试创建一个对象列表,这些对象是模型对象的扩展。实例是使用给定的 Class 对象创建的。 public class ModelFactory { public static final
我是一名优秀的程序员,十分优秀!