可能我错过了一些东西,也许我的假设是错误的,但我认为当我用类型声明参数化方法时,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)
因此,如果我的方法是使用一种类型进行参数化,并且我在两个参数中使用那个类型,为什么它允许我发送两个完全不同类型的对象?我猜想它归结为治疗T的Object?
在新的第三版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泛型是不变的,因此无法进行此类转换:
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) 在使用 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?
在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应用程序中做到这一点?
java ×3
generics ×2
attributes ×1
c# ×1
casting ×1
filter ×1
http-caching ×1
interceptor ×1
invariance ×1
methods ×1
spring-boot ×1
spring-mvc ×1
try-catch ×1
try-finally ×1
winforms ×1