别名对线程安全有什么影响吗?

cigdeys3  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(299)

下面的代码首先通过向下转换来访问变量,我想知道如果方法的返回类型返回与我使用的别名相同的别名,是否会有什么不同( ContainerPieceVolumesBinding binding ),或作为方法参数传入的。
我已经测试了代码,它似乎工作得很好,问题是可能有第二个访问点指向同一个变量(第二个访问点是可选的)。
理论上,第二个访问点将使用viewbind别名,而不是我正在使用的向下转换版本。
如果不是返回方法参数抛出的同一个别名,而是返回向下转换的版本,会有什么区别吗?

@SuppressWarnings("unchecked")
@Override
public ViewDataBinding setData(ViewDataBinding viewBind, @NonNull String bindingTag) {

    BindingVisitorsBaseAdapter adapter = new BindingVisitorsBaseAdapter(
            TAG
    );
    adapter.setCompletePendingBindings(
            pendingBindings
    );
    //This is the downcasted alias
    ContainerPieceVolumesBinding binding = (ContainerPieceVolumesBinding) viewBind;
    binding.pieceVolumesContainer.setAdapter(adapter);
    observer = new ObjectNotifier(
    ) {
        @Override
        public Notifier onNotified() {
            return (response, responseType) -> {
                switch (responseType) {
                    case SUBMIT_LIST :
                        List<BindingVisitor> pieceVolumes = (List<BindingVisitor>) response[0];
                        ((BindingVisitorsBaseAdapter)binding.pieceVolumesContainer.getAdapter()).submitList(pieceVolumes);
                        break;
                    case QUANTITY_CHANGE:
                        onQuantityChanged.onChanged(getValues(binding.pieceVolumesContainer));
                        break;
                }
            };
        }
    };
    observer.notifyResponse(SUBMIT_LIST, new ArrayList<>());
   // returning the original version here
    return viewBind;
}
mspsb9vt

mspsb9vt1#

除非您是通过对象调用引用静态方法,否则向上投射和向下投射不会影响调用的安全性

public class A {
  public void foo() {
    System.out.println("A");
  }
  public static void bar() {
    System.out.println("As"); 
  }
}

public class B extends A {
  private void foo() {
    System.out.println("B");
  }
  public static void bar() {
    System.out.println("Bs"); 
  }
}

A var = new B();

var.foo(); //will print B
var.bar(); //will print A

((B)var).foo(); //will print B 
((B)var).bar(); //will print B

相关问题