小编cto*_*mek的帖子

使用一种类型参数化的方法接受两种类型

可能我错过了一些东西,也许我的假设是错误的,但我认为当我用类型声明参数化方法时,T无论该类型有多少变量,它仍然是相同的类型.但是我看到这个编译并且它反映了我的观点.

static <T> void f(T a, T b) { }

public static void main(String[] args) {
    f(Integer.MIN_VALUE, "...");
}
Run Code Online (Sandbox Code Playgroud)

因此,如果我的方法是使用一种类型进行参数化,并且我在两个参数中使用那个类型,为什么它允许我发送两个完全不同类型的对象?我猜想它归结为治疗TObject

java generics methods

6
推荐指数
1
解决办法
159
查看次数

这个Java Puzzlers代码有什么问题?

在新的第三版Effective Java中,Joshua Bloch提到了Java Puzzlers的一段代码(它是关于在try-finally中关闭资源):

对于初学者来说,我在Java Puzzlers的第88页上弄错了,多年来没有人注意到.事实上,2007年Java库中close方法的三分之二使用是错误的.

但我不确定哪个部分错了?

} finally {
  if (in != null) {
    try {
      in.close();
    } catch (IOException ex) {
      // There is nothing we can do if close fails
    }
  }
  if (out != null) {
    try {
      out.close();
    } catch (IOException ex) {
      // Again, there is nothing we can do if close fails
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这是此代码的新版本:

try {
  OutputStream out = new FileOutputStream(dst);
  try {
    byte[] buf = new byte[BUFFER_SIZE];
    int n;
    while …
Run Code Online (Sandbox Code Playgroud)

java try-catch try-catch-finally try-finally effective-java

5
推荐指数
1
解决办法
274
查看次数

为什么可以强制转换泛型类?

Java泛型是不变的,因此无法进行此类转换:

List<Object> li = (List<Object>)new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)

但是在下面的第4行代码中,我可以从转换List<Integer>List<T>,这里T可以是任何类型。为什么允许这种类型的演员?

我知道它会生成有关未经检查的强制类型转换的警告,但要点是,此强制类型转换可以在参数化方法内部进行,但不能在常规代码中进行。请记住,泛型是不变的,为什么允许它?在普通代码中,List<Integer>我只能将其List<Integer>强制转换为没有任何意义,而其他强制转换是非法的。那么,允许进行第4行中的此类转换有什么意义呢?

我知道泛型类型会在编译时删除,并以结尾List xlist = (List)list,但是在删除这些类型之前,很明显,除非仅在某人通过Integer的情况下才接受此强制类型转换,否则该强制类型转换将不被接受,因为el这没有多大意义。

class Test {

    public static <T> void t(List<Integer> list, T el) {
        List<T> xlist = (List<T>)list; //OK
        xlist.add(el);
    }

    public static void main(String[] args) {

        List<Integer> list = new ArrayList<>();
        t(list, "a");
        t(list, "b");

        //prints [a, b] even if List type is Integer
        System.out.println(list);

    }
}
Run Code Online (Sandbox Code Playgroud)

java generics casting invariance

3
推荐指数
1
解决办法
2224
查看次数

为什么不直接从代码中使用Form.CenterToScreen?

来自msdn:

不要直接从您的代码中调用它.而是将StartPosition属性设置为CenterScreen.

谁知道为什么?

c# winforms

2
推荐指数
1
解决办法
827
查看次数

从 WebFlux 中的 WebFilter 获取 HandlerMethod

在使用 Servlet API 实现拦截器时,我HandlerMethod开箱即用:

... extends HandlerInterceptorAdapter
@Override
public boolean preHandle(final HttpServletRequest request,
                             final HttpServletResponse response, final Object handlerMethod) throws Exception {
Run Code Online (Sandbox Code Playgroud)

我可以HandlerMethod在实施时访问而WebFilter不是HandlerInterceptorAdapter

如果WebFilter我有:

... implements WebFilter {
public Mono<Void> filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {
Run Code Online (Sandbox Code Playgroud)

一旦我可以HandlerMethod通过调用访问serverWebExchange.getAttribute("....bestMatchingHandler"),但它不再起作用了。见相应问题。我的问题是:我怎样才能HandlerMethod不使用serverWebExchange.getAttribute

attributes spring-mvc filter interceptor spring-webflux

2
推荐指数
1
解决办法
929
查看次数

在 WebFlux 中禁用 HTTP 缓存

Spring Boot MVC应用程序中,我以这种方式禁用 HTTP 缓存:

WebContentInterceptor cacheInterceptor = new WebContentInterceptor();
cacheInterceptor.setCacheSeconds(0);
cacheInterceptor.setUseExpiresHeader(true);
cacheInterceptor.setUseCacheControlHeader(true);
cacheInterceptor.setUseCacheControlNoStore(true);
registry.addInterceptor(cacheInterceptor);
Run Code Online (Sandbox Code Playgroud)

如何在Spring Boot WebFlux应用程序中做到这一点?

http-caching spring-boot spring-webflux

2
推荐指数
1
解决办法
684
查看次数