728x90
Environment
Language: Java17
Framework: SpringBoot 3.1.0

 

오류

constructor Jackson2JsonRedisSerializer.Jackson2JsonRedisSerializer(Class<T>) is not applicable(argument mismatch; Class<CAP#2> cannot be converted to Class<T>)
constructor Jackson2JsonRedisSerializer.Jackson2JsonRedisSerializer(JavaType) is not applicable(argument mismatch; Class<CAP#2> cannot be converted to JavaType)
where T is a type-variable:
  T extends Object declared in method <T>set(String,T,long)
where CAP#1,CAP#2 are fresh type-variables:
  CAP#1 extends Object from capture of ? extends Object
  CAP#2 extends Object from capture of ? extends Object

Jackson2JsonRedisSerializer의 생성자에서 Class<T> 타입을 요구

컴파일러가 제네릭 타입을 캡처한 결과인 CAP#2는 T 타입으로 변환할 수 없음

  * CAP#1, CAP#2: 컴파일러가 제네릭 타입을 추론할 때 사용하는 임시 이름으로, T가 ? extends Object (모든 타입을 포함하는 와일드카드)로 사용될 때 부여

 

 

 

원인

public <T> void set(String key, T o, long milliseconds) {
  redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<T>(o.getClass()));
  redisTemplate.opsForValue().set(key, o, milliseconds, TimeUnit.MILLISECONDS);
}

제너릭 타입(<>)에 파라미터(T)를 명시할 경우, 컴파일러가 T의 타입을 자동으로 추론할 수 없음

T의 명확한 타입을 아는 것이 아니라 단순히 와일드 카드(? extends Object)인 것만 알고 있는 상태이므로 o.getClass와 T를 매칭시키지 못함

따라서, 타입을 명시했지만 컴파일 시점에는 타입을 알 수 없어 오류 발생

 

 

해결

public <T> void set(String key, T o, long milliseconds) {
  redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(o.getClass()));
  redisTemplate.opsForValue().set(key, o, milliseconds, TimeUnit.MILLISECONDS);
}

파라미터를 명시하지 않고 타입만 선언(<>)하여, 컴파일러에게 타입 추론 자체를 위임

 

 

 

🙋‍♀️

본 포스트는 공부 목적으로 작성하였습니다.
보시는 도중 잘못된 부분이나 개선할 부분이 있다면 댓글로 알려주시면 수정하도록 하겠습니다.

 

📑

참고 자료

Chat GPT

 

728x90
728x90

👉 기본 환경

- Language: Java

- IDE: Sublime

 

 

⌨️ 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.Arrays;
import java.util.Collections;
 
class Solution {
    public String solution(String s) {
        String answer = "";
        char[] sToCharArr = new char[s.length()];
        for(int i=0; i<s.length(); i++){
            sToCharArr[i] = s.charAt(i);
        }
        Arrays.sort(sToCharArr, Collections.reverseOrder());
        
        StringBuilder sb = new StringBuilder();
        for(int i=s.length()-1; i>-1; i--){
            sb.append(sToCharArr[i]);
        }
        answer = sb.toString();
        return answer;
    }
}
 
 

 

 

🖨️오류

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/Solution.java:11: error: no suitable method found for sort(char[],Comparator<Object>)
        Arrays.sort(sToCharArr, Collections.reverseOrder());
              ^
    method Arrays.<T#1>sort(T#1[],Comparator<? super T#1>) is not applicable
      (inference variable T#1 has incompatible bounds
        equality constraints: char
        lower bounds: Object)
    method Arrays.<T#2>sort(T#2[],int,int,Comparator<? super T#2>) is not applicable
      (cannot infer type-variable(s) T#2
        (actual and formal argument lists differ in length))
  where T#1,T#2 are type-variables:
    T#1 extends Object declared in method <T#1>sort(T#1[],Comparator<? super T#1>)
    T#2 extends Object declared in method <T#2>sort(T#2[],int,int,Comparator<? super T#2>)
 
 

 

 

📡 원인

기본형 타입에 대한 Comparator가 존재하지 않음

 

 

📰 해결 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.Arrays;
import java.util.Collections;
 
class Solution {
    public String solution(String s) {
        String answer = "";
        String[] sToStringArr = s.split("");
        Arrays.sort(sToStringArr, Collections.reverseOrder());
        
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<sToStringArr.length; i++){
            sb.append(sToStringArr[i]);
        }
        answer = sb.toString();
        return answer;
    }
}
 
 

객체 타입의 배열 사용

 

 

 

📚 참고 자료

 

[자바]no suitable method found for sort(int[],(a,b)->Int[...]a, b)) Arrays.sort(numbers, (a, b) -> Integer.compare(a, b

자바에서 custom comparator를 사용하려고 했는데 에러가 발생했습니다. public String solution(int[] numbers) { Arrays.sort(numbers, (a, b) -> Integer.compare(a, b)); 람다식으로도 사용해보고 compare함수도 사용해보고 했

darkstart.tistory.com

 

728x90
728x90

👉 기본 환경

- Language: Java

- IDE: Eclipse

 

 

⌨️ 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        int N = Integer.parseInt(br.readLine());
 
        Map<String, Integer> map = new HashMap<>();
 
        for (int i = 0; i < N; i++) {
            String s = br.readLine();
            map.put(s, s.length());
        }
 
        String[] mapKeys = (String[]) map.keySet().toArray();
        Arrays.sort(mapKeys);
 
        List<Object> keys = new ArrayList<>();
        for (Object key : mapKeys) {
            keys.add(key);
        }
        Collections.sort(keys, ((k1, k2) -> (map.get(k1).compareTo(map.get(k2)))));
 
        for (Object key : keys) {
            bw.write(key + "\n");
        }
 
        bw.flush();
        bw.close();
    }
 
}
 
 
 

 

 

🖨️오류

 java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class [Ljava.lang.String; ([Ljava.lang.Object; and [Ljava.lang.String; are in module java.base of loader 'bootstrap')

 

 

📡 원인

Object[]를 String[]로 바로 형변환 할 수 없음

 

 

📰 해결 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        int N = Integer.parseInt(br.readLine());
 
        Map<String, Integer> map = new HashMap<>();
 
        for (int i = 0; i < N; i++) {
            String s = br.readLine();
            map.put(s, s.length());
        }
 
        String[] mapKeys = map.keySet().toArray(new String[0]);
        Arrays.sort(mapKeys);
 
        List<Object> keys = new ArrayList<>();
        for (Object key : mapKeys) {
            keys.add(key);
        }
        Collections.sort(keys, ((k1, k2) -> (map.get(k1).compareTo(map.get(k2)))));
 
        for (Object key : keys) {
            bw.write(key + "\n");
        }
 
        bw.flush();
        bw.close();
    }
 
}
 
 
 

String[] mapKeys = map.keySet().toArray(new String[0]);

    - Object[]를 String[]을 형변환하는 것이 아닌 개별 요소를 String으로 직접 지정하고 String[]에 저장

    - 요소 타입을 명시적으로 지정하면 map.keySet()에서 반환되는 요소들을 mapeys 배열에 복사

 

+ 배열의 크기를 0으로 지정한 이유

    - 실제 반환될 배열의 크기를 동적으로 조절하고자 0으로 지정

    - 컬렉션의 크기에 맞게 배열이 자동으로 생성되고 요소들이 복사되기 때문에 정확한 크기를 예측하거나 관리할 필요가 없음

 

+ String[] mapKeys = map.keySet().toArray(String s); 가 안되는 이유

    - toArray()의 매개변수는 T[] a이므로 배열을 전달하여 요소 타입을 추론하게 해야 함

 

 

 

📚 참고 자료

 

[Java] ArrayList의 toArray()

ArrayList는 자바로 개발을 하면서 가장 많이 쓰는 리스트의 구현 클래스 중 하나입니다. ArrayList 타입의 String 리스트를 배열로 변환하려 할때는 아래와 같이 사용합니다. ArrayList strs=new ArrayList(); st

jerry92k.tistory.com

 

728x90
728x90

👉 기본 환경

- Language: Java

- IDE: Eclipse

 

 

⌨️ 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
       bw.write(method1({"hello""java""world"}));
 
        bw.flush();
        bw.close();
 
    }
 
    public static String method1(String[] sentence) {
       StringBuffer sb = new StringBuffer();
        for (String s : sentence) {
            sb.append(s);
        }
        return sb.toString();
    }
 
 
 

 

 

🖨️오류

Syntax error, insert 'SimpleName' to complete ArgumentList:

 

 

📡 원인

medthod1의 매개변수로 String[]이 전달되어야 함

{}로 객체 생성을 할 수 없음

 

 

📰 해결 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        bw.write(method1(new String[]{"hello""java""world"}));
 
        bw.flush();
        bw.close();
 
    }
 
    public static String method1(String[] sentence) {
        StringBuffer sf = new StringBuffer();
        for (String s : sentence) {
            sb.append(s);
        }
        return sb.toString();
    }
 
 
 

new String[]으로 객체 생성 후, 매개변수로 String[] 전달

 

728x90
728x90

👉 기본 환경

- Language: Java

- IDE: Eclipse

 

 

⌨️ 코드

1
2
3
4
5
        int[] intArr = new int[3];
        while (intArr.length-- > 0) {
 
        }
 
 
 

 

 

🖨️오류

java.lang.Error: Unresolved compilation problem: The final field array.length cannot be assigned

 

 

📡 원인

array의 length 값은 final 값으로 변경할 수 없음

 

 

📰 해결 방법

1
2
3
4
5
6
        int[] intArr = new int[3];
        int len = intArr.length;
        while (len-- > 0) {
 
        }
 
 

새로운 변수를 선언해서 length값을 넣고, 해당 변수의 값을 변경

 

728x90